平台大小端存储差异怎样去解决

常用处理差异办法

关于差异的处理,前文提到的全部采用uint8_t类型进行设计,比较保险稳妥,但数据量大、项目需求复杂的时候,未必就能满足,所以还是需要正面应对这些硬性问题。

这里整理出几个简单转换的过程。

1. 多个uint8_t转uint16_t/uint32_t

这个转换很容易可以实现,信手拈来:

val_u16 = (val_u8_tmp1《《8) |val_u8_tmp2;

这里的转基本都是把两个uint8_t类型“组合”成uint16_t或者uint32_t,而实际项目工程中,多是对uint8_t类型的数据流进行转换,并且是转换部分数据,因此这里直接写成宏定义,便于开发移植:

小端模式转成uint16_t/uint32_t

 平台大小端存储差异怎样去解决_设计制作_测量仪表

大端模式转成uint16_t/uint32_t

 平台大小端存储差异怎样去解决_设计制作_测量仪表

分析小端模式转成uint16_t类型的数据,首先将这一长串的宏拆分然后逐步去理解:

实际是((uint16_t)*(vola     ti   le uint8_t*)((ptr)+1)《《8)和(uint16_t)*(vola  TI le uint8_t*)(ptr)两个数据进行位或的运算。

1.右半边 (vola  TI leuint8_t*)(ptr)是将ptr所指地址强转为vola  TI le uint8_t*类型;

2.然后是使用*(vola  TI leuint8_t*)(ptr)根据地址从内存中取出该字节;

3.紧接着将取出的一字节数据使用(uint16_t)强制类型转换成uint16_t类型。

同样的原理,

1.左半边(volatileuint8_t*)((ptr)+1)是将prt所指地址的下一个内存单元强转为volatile uint8_t*类型;

2.然后是使用*(volatileuint8_t*)((ptr)+1) 根据地址从内存中取出该字节;

3.紧接着将取出的一字节数据使用(uint16_t)强制类型转换成uint16_t类型,再左移8位处理。

最后将两个结果做位或运算,即实现了“组合”,返回uint16_t类型结果。

以上过程分析的比较啰嗦,并且其中做的一些强转和volatile修饰也是很有必要的,因为设计的宏要想可靠,还考虑到在有中断、有事件处理的系统里,对数据操作还是需要谨慎些!

2.单个uint16_t/uint32_t转uint8_t

单个字/双字转成字节,使用场景比较少,最简单方式直接利用位与(&)和移位运算。

取低字节:

val_u8_tmp = val_u16&0xFF;

取高字节:

val_u8_tmp =(val_u16》》8)&0xFF;

3.对uint16_t/uint32_t类型进行字/双字内自转

其原理一样是操作内存地址的方式,写成宏定义,方便使用。

 平台大小端存储差异怎样去解决_设计制作_测量仪表

其转换的结果是将原数据翻转成相反的端模式。

总结,项目的开发细节问题弄清楚了,对后续的开发工作也是磨刀不误砍柴工,并且在有通信需求时,尤其有必要做好通信协议的沟通协调,设计一套双方通用的协议结构,对后续开发有着规范可循,对解决Bug也可以快速定位问题!

责任编辑:ct

45
74
0
77

相关资讯

  1. 1、有沟通障碍?刘亦菲rain罕见同框,神仙姐姐却全程冷漠脸!3095
  2. 2、从营销少女感到运动鞋穿帮,上阳赋越道歉,网友越不买章子怡的账3728
  3. 3、“19禁”《人间中毒》夺冠《哥斯拉》屈居第二2268
  4. 4、朱茵版紫霞老去,抖音版紫霞来了953
  5. 5、一部戏被压7年,拍戏时的男配播出时已是顶流,被粉丝质疑蹭热度1759
  6. 6、《私人订制》排片过半创内地片首日排片新纪录971
  7. 7、《八月未央》口碑扑街,剧情狗血演技拉胯,网友:意料之中1090
  8. 8、《飘落的羽毛》“飘”到蒙特利尔导演王艺获奖1907
  9. 9、春节档七部电影,只有《侍神令》亏钱,其他六部均回本甚至小赚!4510
  10. 10、五一档电影预售票房排行:老戏骨不敌新演员!郭富城新片未进前三317
全部评论(0)
我也有话说
0
收藏
点赞
顶部