C 为什么ip_hl和ip_v的顺序会因系统字节顺序而改变

C 为什么ip_hl和ip_v的顺序会因系统字节顺序而改变,c,ip,packet,C,Ip,Packet,为什么ip_hl和ip_v的顺序会按系统字节顺序变化 当二进制字符串大于1字节时,我必须关心字节顺序。 然而,ip_-hl和ip_-v在一个字节中,所以我认为我不需要关心ip_-hl和ip_-v的字节顺序 struct ip { #if BYTE_ORDER == LITTLE_ENDIAN u_char ip_hl:4, /* header length */ ip_v:4; /* version */ #endif #if BYTE_

为什么ip_hl和ip_v的顺序会按系统字节顺序变化

当二进制字符串大于1字节时,我必须关心字节顺序。 然而,ip_-hl和ip_-v在一个字节中,所以我认为我不需要关心ip_-hl和ip_-v的字节顺序

struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN 
    u_char  ip_hl:4,        /* header length */
        ip_v:4;         /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN 
    u_char  ip_v:4,         /* version */
        ip_hl:4;        /* header length */
#endif
    u_char  ip_tos;         /* type of service */
    short   ip_len;         /* total length */
    u_short ip_id;          /* identification */
    short   ip_off;         /* fragment offset field */
...
};

`ip_v和
ip_hl
字段是位字段。该标准不保证结构中位字段的顺序

根据本规范第6.7.2.1节:

11一个实现可以分配任何足够大的可寻址存储单元来容纳一个位字段。如果剩余的空间足够大,则需要一个位字段 结构中紧跟其后的另一个位字段应打包 插入同一单元的相邻位。如果空间不足, 是否将不适合的位字段放入下一个单元或 实现定义了相邻单元的重叠顺序 单元内位字段的分配(从高阶到低阶或 低阶到高阶)是实现定义的。路线 未指定可寻址存储单元

对于这个表示IP头的特定结构,它是在系统头文件中定义的结构,因此它具有一些关于位字段顺序的实现知识。由于IP报头必须先有版本字段,然后是报头长度,
#if
检查系统的结尾,以确定将字段放置在结构中的顺序,从而使其最终位于正确的位置,从而允许将结构覆盖到接收的数据包缓冲区上以读取IP报头。据推测,小端系统将反转位场的顺序,而大端系统则不会


然而,这不是您应该尝试在用户代码中执行的操作,因为它在不同的系统上的行为可能会有所不同。这样的代码在系统头中是允许的,因为它们驻留在特定的实现中,可以安全地做出某些假设。

您的问题真的是“为什么”吗?是的,我想知道顺序的原因。事实上,是的。我认为字节顺序在这里不应该有影响。但这可能会影响其他地方的整体钻头订单。谢谢。我已经理解了位域和小端点的关系。