C-字节内(位间)存在大小端问题吗?
在嵌入式软件开发中为了考虑对不同CPU的兼容问题,都需要考虑大小端问题,尤其是在需要通过网络或总线传输的时候。我已知道大小端问题存在于高低字节间,但是不知道字节内(位间)是否同样存在大小端问题
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
在嵌入式软件开发中为了考虑对不同CPU的兼容问题,都需要考虑大小端问题,尤其是在需要通过网络或总线传输的时候。我已知道大小端问题存在于高低字节间,但是不知道字节内(位间)是否同样存在大小端问题
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
软件上不需要考虑这个问题。如果真的出现这种问题,那是硬件连线搞反了。
不存在大小端的问题。因为大小端的问题实质上是一个串转并的问题:
比如一个int有4个字节,如果一次读取整个int(相当于并行读取),和分四次读取四个byte(相当于串行读取),读到的次序和int中应该有的次序是什么关系?依据顺序的不同分成大端和小端,这个实际上是描述了从串行的8位数据转换成并行的32位数据时,遵循的数据顺序。
然而CPU能读取的最小单位就是一个字节,所以读一个字节的时候一定是同时读8位,所以不存在串转并的问题;字节内左移、右移之类的操作得到的结果都是规定好的,和CPU内部存储的bit顺序也没有关系。至于CPU内部硬件上是存成什么顺序的,这个对程序员来说没有任何区别,因为不存在按顺序读bit这样的操作。
唯一会遇到字节内串转并的情况是:以太网、USB等串行协议,不过这些协议都严格规定了字节中的bit顺序,也没有搞反的可能性。所以字节内无所谓大端小端格式。
字节内应该没有,不过字节间是存在大小端的问题的。一般x86计算机都是小端模式。
有一种情况讨论楼主所述的问题,叫做高位在先或低位在先,是串行设备通讯时的约定,属于单片机或嵌入式的范畴,上层代码一般不考虑。
例如RS232,也就是电脑串口,通信时,每字节数据低位在先高位在后,即先发送该字节的第0位,然后依次是第1位...第7位。
I2C协议则是规定首先传输每字节的高位。SPI协议两种情况都允许,故需要查询硬件资料或双方进行约定。
当然其他的通信设备或自定义的协议可以是高位在先低位在后。只要通信双方约定好就行。
还有说线序搞反的,有点开玩笑的意味了吧,谁能这么粗心啊。。。
对于所说的,确实有的协议规定了字节内顺序,有的没规定,但现在一般是用硬件接口进行通信,数据读写是直接操作寄存器的,所以,对于协议规定好字节内顺序的,直接读写就是了,代码上是不需要考虑字节内顺序的,如出现错误只能说明是硬件问题或对方不遵守协议,转换纯属多此一举,而且转换操作很浪费时间。如果协议未规定,需要提前约定的,一般都可以通过设置寄存器来匹配的。
1、正常一个字节内是没有大端小端的,字节序的最小单位是Byte。
2、如果牵涉到位域,即bit field,是有位域序的, 比如在Linux内核协议栈的ip.h中,对ip报头的结构体定义如下:
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
从代码里可以看出大小端是有区别的。