为什么根据字节顺序交换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. */
};
答
这由实现(psABI-)特有的,但是这是怎么回事是一个字节或字,就相关的实施实践中位域的位顺序,匹配一个字内字节的字节顺序。因此,为了使这些成员占据与使用哪种类型的系统无关的相同比特位置,其顺序基于字节顺序进行交换。
这些类型是整数(各种大小),而不是字节。您使用位域的事实不会改变这一点。另外,你不能保证(可移植的)位域是如何存储在内部的。如果CHAR_BIT合适,您可以使用无符号字符。 – 2013-03-15 22:06:59
但是,重要的是声明的顺序根据字节顺序而变化。当我收到一个数据包并想将它映射到这个结构时,这很重要。 – 2013-03-15 22:09:10