关于位域和字节序的问题

风之子赛拉飞尔 2016-07-20 03:58:45
检索了一下,论坛里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声明中,前后两个变量哪个表示低位,哪个表示高位。
...全文
285 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-07-21
  • 打赏
  • 举报
回复
位域涉及 位序,和字节序这两个东西,都是不确定的,由实现决定 所以没啥可讨论的。 如果 有字节序问题,可以校正(网络传播都会处理好的) 位序问题,也是一样。 如果位域存到文件里,最好标注字节序,和位序 这样读取的时候,就可以按照不同的位序,字节序处理了 位序测定,直接用一个字节的位段检测 字节序检测,直接用int (例如和 char 数组的union) 检测 字节序,intel x86系列CPU,和motorola 68XXX系列CPU 作为字节序类型的两个代表,一个为小端的话,另一个就是大端。 另外,我看到过字节序的两种,大小端的说法, 一种说intel 是小端, 一种说是大端,不知道为什么 PS: 一般程序都不关心位序,因为不同位序的程序,编译好以后,一般不影响使用 除非存为文件,供别的程序使用 字节序,往往也是存为文件,或者网上传播,才会有问题
fefe82 2016-07-20
  • 打赏
  • 举报
回复
引用
前后两个变量哪个表示低位,哪个表示高位。
这个东西是 implementation-defined ,意味着不同的实现可能不同 ...

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧