首页 > 解决方案 > 字节序如何影响结构中的位域定义?

问题描述

使用 iphdr 作为第一个示例:

struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
    __u8    ihl:4,
            version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
    __u8    version:4,
            ihl:4;
#else
#error  "Please fix <asm/byteorder.h>"
#endif

    /* other fields are emitted. */
};

我的问题 1,据我所知,字节序仅在处理多字节时才会影响,换句话说,如果只有 1 个字节,就没有“位顺序”这样的事情。在上面的定义中,ihl+version= 8 bits = 1 byte,ihl 和 version 驻留在一个字节中,我们为什么要关心 ihl 和 version 的字节顺序和倒序呢?

如果“位顺序”是一个问题,我的问题 2 是为什么另一个 struct ip_options 不关心字节顺序?

struct ip_options {
    __be32      faddr;
    __be32      nexthop;
    unsigned char   optlen;
    unsigned char   srr;
    unsigned char   rr;
    unsigned char   ts;
    unsigned char   is_strictroute:1,  // why this byte doesn't care endianness?
                    srr_is_hit:1,
                    is_changed:1,
                    rr_needaddr:1,
                    ts_needtime:1,
                    ts_needaddr:1;
    unsigned char   router_alert;
    unsigned char   cipso;
    unsigned char   __pad2;
    unsigned char   __data[0];
};

标签: cendianness

解决方案


C 不需要字节字节序来指示是__u8 ihl:4使用 4 个 MSBits 还是 4 个 LSBits。

为什么我们要关心 ihl 和版本的字节顺序和倒序?

原作者可能想覆盖struct iphdr一个硬件地址,玩union魔术或实现某种串行通信顺序。

该方法的可移植性不高,但可能已经满足了最初的有限需求。

如果“位顺序”是一个问题,我的问题 2 是为什么另一个 struct ip_options 不关心字节顺序?

这是一种反复无常。

处理标题后的字节序可能无关紧要。标头类型struct iphdr可能需要与字节序无关的编码,但是一旦分配了这些成员,剩余的代码就会相应地进行解释。如果除标题之外的所有内容都具有#if defined(__LITTLE_ENDIAN_BITFIELD).

.tiff做了这样的事情。


推荐阅读