为什么根据字节顺序交换IP头变量声明

为什么根据字节顺序交换IP头变量声明

问题描述:

我的Ubuntu发行版上的ip.h文件具有以下复制的struct iphdr。任何人都可以解释为什么变量ihl和版本的顺序根据字节顺序而变化。根据我的理解,如果有多于一个字节,“endianess”将会很重要,但在这种情况下,这两个(ihl和version)组合起来形成一个字节。因此,小字节或大字节不应影响字节内各位的排序。为什么根据字节顺序交换IP头变量声明

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

这些类型是整数(各种大小),而不是字节。您使用位域的事实不会改变这一点。另外,你不能保证(可移植的)位域是如何存储在内部的。如果CHAR_BIT合适,您可以使用无符号字符。 – 2013-03-15 22:06:59

+0

但是,重要的是声明的顺序根据字节顺序而变化。当我收到一个数据包并想将它映射到这个结构时,这很重要。 – 2013-03-15 22:09:10

这由实现(psABI-)特有的,但是这是怎么回事是一个字节或字,就相关的实施实践中位域的位顺序,匹配一个字内字节的字节顺序。因此,为了使这些成员占据与使用哪种类型的系统无关的相同比特位置,其顺序基于字节顺序进行交换。