【发布时间】:2019-12-04 00:49:52
【问题描述】:
使用 iphdr 作为第一个示例:
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
/* other fields are emitted. */
};
我的问题 1,据我所知,字节序仅在处理多字节时才会影响,换句话说,如果只有 1 个字节,就没有“位顺序”这样的事情。在上面的定义中,ihl+version= 8 bits = 1 byte,ihl和version在一个字节中,为什么要关心ihl和version的字节序和倒序呢?
如果“位顺序”是个问题,我的问题 2 是为什么另一个 struct ip_options 不关心字节顺序?
struct ip_options {
__be32 faddr;
__be32 nexthop;
unsigned char optlen;
unsigned char srr;
unsigned char rr;
unsigned char ts;
unsigned char is_strictroute:1, // why this byte doesn't care endianness?
srr_is_hit:1,
is_changed:1,
rr_needaddr:1,
ts_needtime:1,
ts_needaddr:1;
unsigned char router_alert;
unsigned char cipso;
unsigned char __pad2;
unsigned char __data[0];
};
【问题讨论】:
-
这是 linux 源代码吗?我相信
struct ip_options不会脱离内核,所以没有人关心位域的顺序是否改变。至于struct iphdr,我猜ip头是这个结构的别名,所以你必须管理你的编译器来生成正确的代码。 -
字节序定义了位的顺序,从最低到最高或从最高到最低。这也会影响位域。
-
byte(或更大)中位字段的顺序取决于编译器的实现。出于这个原因,最好尽可能避免使用位字段(例如使用shifting代替
标签: c endianness