关于位域和字节序的问题

C语言 码拜 8年前 (2016-05-18) 1085次浏览
检索了一下,论坛里3年以来没有相关的帖子,时间上可能最近的一篇为 http://bbs.csdn.net/topics/390383203
To:没有用过位域的坛友,这里给个例子(变化自IP头结构):

struct MyStruct
{
    BYTE a : 4;   // 低4位
    BYTE b : 4;   // 高4位
    WORD c : 13; // 低13位
    WORD d : 3;   // 高3位
}

近来用到套接字和原始套接字,也用到位域,研究了一下位域和字节序的问题。
先说一下字节序。
由于网口数据是大端序,而Windows是小端序,所以Windows Socket编程中,
对超过一个字节的整型值,就需要做字节序的转换(如针对IP头)。请注意,
字节序针对的只是多字节的整体数据,字符或字节数组并不涉及字节序问题,
原因是是逐个字节存储的。多字节类型数组,元素的顺序与字节序需无关,元素
本身则涉及字节序问题。
然而位域这个东西确是特殊的,需明确一下,不论位域能否跨字节,位域内部
均不涉及字节序问题
。实际上我们需要想一下,在发送端,位域是怎么填充的,
显然并不是数值赋值操作,而是字节填充或拷贝操作。这也就不涉及字节序了,
只是要注意一下在struct声明中,前后两个变量哪个表示低位,哪个表示高位。

解决方案

20

引用

前后两个变量哪个表示低位,哪个表示高位。

这个东西是 implementation-defined ,意味着不同的实现可能不同 …

20

位域涉及 位序,和字节序这两个东西,都是不确定的,由实现决定
所以没啥可讨论的。
假如 有字节序问题,可以校正(网络传播都会处理好的)
位序问题,也是一样。
假如位域存到文件里,最好标注字节序,和位序
这样读取的时候,就可以按照不同的位序,字节序处理了
位序测定,直接用一个字节的位段检测
字节序检测,直接用int (例如和 char 数组的union) 检测
字节序,intel x86系列CPU,和motorola 68XXX系列CPU
作为字节序类型的两个代表,一个为小端的话,另一个就是大端。
另外,本人看到过字节序的两种,大小端的说法,
一种说intel 是小端,
一种说是大端,不知道为什么
PS:
一般程序都不关心位序,原因是不同位序的程序,编译好以后,一般不影响使用
除非存为文件,供别的程序使用
字节序,往往也是存为文件,或网上传播,才会有问题

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于位域和字节序的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)