检索了一下,论坛里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
引用