uint型变量倒转问题。

本文讨论了在C#中如何将一个uint类型的变量进行字节倒转,以解决GPRS模块中IP地址字节顺序错误的问题。通过按位与、移位和按位或的操作,实现了原始的解决方案。同时,作者希望寻求更巧妙的方法,并分享了自己的C#代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做GPRS模块时遇到这样一个问题,DTU(数据终端设备)连接到数据服务中心(DSC)时,DSC所获得的IP地址四个字节是倒过来的。-_-凸
现在得想个办法把它倒转回来。

其实这个问题以前遇到过,更一般地说,现在有一个uint型的变量,也就是32位。
比如它四个八位的排列顺序是
1 2 3 4
我现在想把它转成
4 3 2 1

我目前能想到的办法,就是按位与,然后移位,然后按位或。
也就是用四个数0xff000000,0x00ff0000,0x0000ff00,0x000000ff分别与它相与,
然后再把结果移位移到相应位置,
也就是第一个字节右移24位,第二个字节右移8位,第三个字节左移8位,第四个字节左移24位。
然后相或,就得到倒转过来的uint变量。

这是最原始的想法,比较肤浅。耗费时间空间也很多。不过总算能实现功能。
不过我记得以前解决这问题的时候还有一种巧妙的方法,以往印象比较深刻,现在就是死活想不起来了。不爽呀!-_-#
还望各位达人路过的时候,有什么好的想法,尽管砸过来,不胜感激。^_^

下面是我用C#按照我的思路实现的代码,很是肤浅,厚着脸皮拿出来雅俗共赏了。-_-

  private uint uint_convert( uint uint_32)
  {
   uint temp8  = 0;
   uint temp16 = 0;
   uint temp24 = 0;
   uint temp32 = 0;

   temp8  = (uint_32 & 0xff000000)>>24;      //取得第一个八位,右移24位
   temp16 = (uint_32 & 0x00ff0000)>>

#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "PWM.h" #include "CAR.h" #include "Track.h" int main(void) { Car_Init(); Infrared_Init(); OLED_Init(); while (1) { if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0) { Go_Ahead(); }else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==1&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==1){ Car_Stop(); }else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==1){ Self_Right(); }else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0){ Turn_Right(); }else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==1){ Turn_Right(); } else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0){ Turn_Left(); }else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==1&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0){ Self_Left(); }else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==1&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&& GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0) Turn_Left(); } } #include "stm32f10x.h" // Device header void Infrared_Init() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } #ifndef __INFRARED_H #define __INFRARED_H void Infrared_Init(); #endif #include "stm32f10x.h" // Device header #include "Motor.h" #include "Delay.h" void Car_Init(){ Motor_Init(); } void Go_Ahead(){ Motor_SetLeftSpeed(-70); Motor_SetRightSpeed(70); } void Go_Back(){ Motor_SetLeftSpeed(70); Motor_SetRightSpeed(-70); } void Turn_Left(){ Motor_SetLeftSpeed(0); Motor_SetRightSpeed(70); } void Turn_Right(){ Motor_SetRightSpeed(0); Motor_SetLeftSpeed(-70); } void Self_Left(){ Motor_SetLeftSpeed(70); Motor_SetRightSpeed(70); } void Self_Right(){ Motor_SetLeftSpeed(-70); Motor_SetRightSpeed(-70); } void Car_Stop(){ Motor_SetLeftSpeed(0); Motor_SetRightSpeed(0); } #ifndef __CAR_H #define __CAR_H void Car_Init(); void Self_Right(); void Self_Left(); void Turn_Right(); void Turn_Left(); void Go_Back(); void Go_Ahead(); void Car_Stop(); #endif#include "stm32f10x.h" // Device header #include "PWM.h" void Motor_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); PWM_Init(); } void Motor_SetLeftSpeed(int8_t Speed) { if (Speed >0) { GPIO_SetBits(GPIOA, GPIO_Pin_4); GPIO_ResetBits(GPIOA, GPIO_Pin_5); PWM_SetCompare3(Speed); } else if(Speed==0){ GPIO_SetBits(GPIOA, GPIO_Pin_4); GPIO_SetBits(GPIOA, GPIO_Pin_5); PWM_SetCompare3(Speed); }else{ GPIO_ResetBits(GPIOA, GPIO_Pin_4); GPIO_SetBits(GPIOA, GPIO_Pin_5); PWM_SetCompare3(-Speed); } } void Motor_SetRightSpeed(int8_t Speed) { if (Speed >0) { GPIO_SetBits(GPIOA, GPIO_Pin_6); GPIO_ResetBits(GPIOA, GPIO_Pin_7); PWM_SetCompare3(Speed); } else if(Speed==0){ GPIO_SetBits(GPIOA, GPIO_Pin_6); GPIO_SetBits(GPIOA, GPIO_Pin_7); PWM_SetCompare3(Speed); }else{ GPIO_ResetBits(GPIOA, GPIO_Pin_6); GPIO_SetBits(GPIOA, GPIO_Pin_7); PWM_SetCompare3(-Speed); } } #ifndef __MOTOR_H #define __MOTOR_H void Motor_Init(void); void Motor_SetLeftSpeed(int8_t Speed); void Motor_SetRightSpeed(int8_t Speed); #endif #include "stm32f10x.h" #include "OLED_Font.h" /*引脚配置*/ #define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) #define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x)) /*引脚初始化*/ void OLED_I2C_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_Init(GPIOB, &GPIO_InitStructure); OLED_W_SCL(1); OLED_W_SDA(1); } /** * @brief I2C开始 * @param 无 * @retval 无 */ void OLED_I2C_Start(void) { OLED_W_SDA(1); OLED_W_SCL(1); OLED_W_SDA(0); OLED_W_SCL(0); } /** * @brief I2C停止 * @param 无 * @retval 无 */ void OLED_I2C_Stop(void) { OLED_W_SDA(0); OLED_W_SCL(1); OLED_W_SDA(1); } /** * @brief I2C发送一个字节 * @param Byte 要发送的一个字节 * @retval 无 */ void OLED_I2C_SendByte(uint8_t Byte) { uint8_t i; for (i = 0; i < 8; i++) { OLED_W_SDA(Byte & (0x80 >> i)); OLED_W_SCL(1); OLED_W_SCL(0); } OLED_W_SCL(1); //额外的一个时钟,不处理应答信号 OLED_W_SCL(0); } /** * @brief OLED写命令 * @param Command 要写入的命令 * @retval 无 */ void OLED_WriteCommand(uint8_t Command) { OLED_I2C_Start(); OLED_I2C_SendByte(0x78); //从机地址 OLED_I2C_SendByte(0x00); //写命令 OLED_I2C_SendByte(Command); OLED_I2C_Stop(); } /** * @brief OLED写数据 * @param Data 要写入的数据 * @retval 无 */ void OLED_WriteData(uint8_t Data) { OLED_I2C_Start(); OLED_I2C_SendByte(0x78); //从机地址 OLED_I2C_SendByte(0x40); //写数据 OLED_I2C_SendByte(Data); OLED_I2C_Stop(); } /** * @brief OLED设置光标位置 * @param Y 以左上角为原点,向下方向的坐标,范围:0~7 * @param X 以左上角为原点,向右方向的坐标,范围:0~127 * @retval 无 */ void OLED_SetCursor(uint8_t Y, uint8_t X) { OLED_WriteCommand(0xB0 | Y); //设置Y位置 OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4)); //设置X位置高4位 OLED_WriteCommand(0x00 | (X & 0x0F)); //设置X位置低4位 } /** * @brief OLED清屏 * @param 无 * @retval 无 */ void OLED_Clear(void) { uint8_t i, j; for (j = 0; j < 8; j++) { OLED_SetCursor(j, 0); for(i = 0; i < 128; i++) { OLED_WriteData(0x00); } } } /** * @brief OLED显示一个字符 * @param Line 行位置,范围:1~4 * @param Column 列位置,范围:1~16 * @param Char 要显示的一个字符,范围:ASCII可见字符 * @retval 无 */ void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char) { uint8_t i; OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8); //设置光标位置在上半部分 for (i = 0; i < 8; i++) { OLED_WriteData(OLED_F8x16[Char - ' '][i]); //显示上半部分内容 } OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8); //设置光标位置在下半部分 for (i = 0; i < 8; i++) { OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]); //显示下半部分内容 } } void OLED_ShowChinese(uint8_t Line, uint8_t Column, uint8_t num) { uint8_t i; OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8); //设置光标位置在上半部分 for (i = 0; i < 8; i++) { OLED_WriteData(OLED_chinese[num][i]); //显示上半部分内容 } OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8); //设置光标位置在下半部分 for (i = 0; i < 8; i++) { OLED_WriteData(OLED_chinese[num][i + 8]); //显示下半部分内容 } } void OLDE_ShowChinese2(uint8_t Line, uint8_t Column, uint8_t num) { OLED_ShowChinese(Line,Column,num); OLED_ShowChinese(Line,Column+1,num+1); } /** * @brief OLED显示字符串 * @param Line 起始行位置,范围:1~4 * @param Column 起始列位置,范围:1~16 * @param String 要显示的字符串,范围:ASCII可见字符 * @retval 无 */ void OLED_ShowString(uint8_t Line, uint8_t Column, char *String) { uint8_t i; for (i = 0; String[i] != '\0'; i++) { OLED_ShowChar(Line, Column + i, String[i]); } } /** * @brief OLED次方函数 * @retval 返回值等于X的Y次方 */ uint32_t OLED_Pow(uint32_t X, uint32_t Y) { uint32_t Result = 1; while (Y--) { Result *= X; } return Result; } /** * @brief OLED显示数字(十进制,正数) * @param Line 起始行位置,范围:1~4 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~4294967295 * @param Length 要显示数字的长度,范围:1~10 * @retval 无 */ void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) { uint8_t i; for (i = 0; i < Length; i++) { OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0'); } } /** * @brief OLED显示数字(十进制,带符号数) * @param Line 起始行位置,范围:1~4 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:-2147483648~2147483647 * @param Length 要显示数字的长度,范围:1~10 * @retval 无 */ void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length) { uint8_t i; uint32_t Number1; if (Number >= 0) { OLED_ShowChar(Line, Column, '+'); Number1 = Number; } else { OLED_ShowChar(Line, Column, '-'); Number1 = -Number; } for (i = 0; i < Length; i++) { OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0'); } } /** * @brief OLED显示数字(十六进制,正数) * @param Line 起始行位置,范围:1~4 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~0xFFFFFFFF * @param Length 要显示数字的长度,范围:1~8 * @retval 无 */ void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) { uint8_t i, SingleNumber; for (i = 0; i < Length; i++) { SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16; if (SingleNumber < 10) { OLED_ShowChar(Line, Column + i, SingleNumber + '0'); } else { OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A'); } } } /** * @brief OLED显示数字(二进制,正数) * @param Line 起始行位置,范围:1~4 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~1111 1111 1111 1111 * @param Length 要显示数字的长度,范围:1~16 * @retval 无 */ void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) { uint8_t i; for (i = 0; i < Length; i++) { OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0'); } } /** * @brief OLED初始化 * @param 无 * @retval 无 */ void OLED_Init(void) { uint32_t i, j; for (i = 0; i < 1000; i++) //上电延时 { for (j = 0; j < 1000; j++); } OLED_I2C_Init(); //端口初始化 OLED_WriteCommand(0xAE); //关闭显示 OLED_WriteCommand(0xD5); //设置显示时钟分频比/振荡器频率 OLED_WriteCommand(0x80); OLED_WriteCommand(0xA8); //设置多路复用率 OLED_WriteCommand(0x3F); OLED_WriteCommand(0xD3); //设置显示偏移 OLED_WriteCommand(0x00); OLED_WriteCommand(0x40); //设置显示开始行 OLED_WriteCommand(0xA1); //设置左右方向,0xA1正常 0xA0左右反置 OLED_WriteCommand(0xC8); //设置上下方向,0xC8正常 0xC0上下反置 OLED_WriteCommand(0xDA); //设置COM引脚硬件配置 OLED_WriteCommand(0x12); OLED_WriteCommand(0x81); //设置对比度控制 OLED_WriteCommand(0xCF); OLED_WriteCommand(0xD9); //设置预充电周期 OLED_WriteCommand(0xF1); OLED_WriteCommand(0xDB); //设置VCOMH取消选择级别 OLED_WriteCommand(0x30); OLED_WriteCommand(0xA4); //设置整个显示打开/关闭 OLED_WriteCommand(0xA6); //设置正常/倒转显示 OLED_WriteCommand(0x8D); //设置充电泵 OLED_WriteCommand(0x14); OLED_WriteCommand(0xAF); //开启显示 OLED_Clear(); //OLED清屏 } #ifndef __OLED_H #define __OLED_H void OLED_Init(void); void OLED_Clear(void); void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char); void OLED_ShowString(uint8_t Line, uint8_t Column, char *String); void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length); void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length); void OLED_ShowChinese(uint8_t Line, uint8_t Column, uint8_t num); void OLDE_ShowChinese2(uint8_t Line, uint8_t Column, uint8_t num); #endif Stm32f103c6t8智能小车,4个红外传感TCRT5000模块DO口接线管脚为PB12、PB13、PB14、PB15,HC-SR04超声波测距模块的接线管教为Trig为PB0,Echo为PB1,TB6612FNG直流电机驱动模块驱动的两个电机的管脚为PB4、PB5、PB6、PB7,蜂鸣器模块的I/O接口管脚为PA0。代码烧录软件为Keil5。 目前寻迹代码正常且小车行驶没有问题,现在请帮忙通过修改优化main.c和创建进的文件实现:小车起动10s后,停车5s,然后继续前行,行驶两圈后停车;实时显示小车的行驶时间(计时范围0-99s),停车后显示总行程的时间。
最新发布
07-11
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值