我的Ubuntu发行版上的ip.h文件下面复制了以下结构iphdr。任何人都可以解释为什么变量ihl和版本的顺序根据字节顺序而变化。根据我的理解,如果有多个字节,“endianess”会很重要,但在这种情况下,这两个(ihl和version)组合成一个字节。因此,小端或大端不应该影响一个字节内的位的排序。
struct iphdr
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ihl:4;
unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
unsigned int version:4;
unsigned int ihl:4;
#else
# error "Please fix <bits/endian.h>"
#endif
u_int8_t tos;
u_int16_t tot_len;
u_int16_t id;
u_int16_t frag_off;
u_int8_t ttl;
u_int8_t protocol;
u_int16_t check;
u_int32_t saddr;
u_int32_t daddr;
/*The options start here. */
};
答案 0 :(得分:3)
这是实现 - (psABI-)特定的,但是正在发生的是,字节或字内的位域的位顺序(实际上在相关实现中)与字中字节的字节顺序匹配。因此,为了使这些成员占用相同的位位置而不依赖于使用哪种类型的系统,它们的顺序将根据字节顺序进行交换。