4

我的 Ubuntu 发行版上的 ip.h 文件在下面复制了以下 struct iphdr。谁能解释为什么变量 ihl 和版本的顺序会根据字节顺序而变化。根据我的理解,如果有多个字节,“字节序”会很重要,但在这种情况下,这两个(ihl 和版本)结合起来形成一个字节。因此,小端或大端不应该影响字节内位的顺序。

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. */
  };
4

1 回答 1

4

这是特定于实现(psABI-)的,但实际情况是字节或字中位域的位顺序,在相关实现的实践中,与字中字节的字节顺序相匹配。因此,为了让这些成员占据相同的位位置,而与正在使用的系统类型无关,它们的顺序根据字节顺序交换。

于 2013-03-15T21:46:31.980 回答