繁体   English   中英

联合中具有Bit字段的Endianess独立代码

[英]Endianess independent code with Bit fields in Union

我想知道编写与字节序无关的代码的最佳方法是什么,特别是在使用数组“ test_attr [0] / test_attr [1]”访问位字段时?

struct tagTest
{
    union
    {
        struct
        {
            uint16 A:3;  
            uint16 B:3;  
            uint16 C:3;  
            uint16 D:3;  
            uint16 E:3;  
            uint16 F:1;
            uint16 G:3;  
            uint16 H:3;  
            uint16 I:3;  
            uint16 J:3;  
            uint16 K:4;  
        } Attributes;

        uint16 test_attr[2];  
    } EndianIndependent;
};               

在某些来源中使用以下方式:

struct
{
#if BYTE_ORDER == LITTLE_ENDIAN
   uint16 A:4;  
   uint16 B:4;  
   uint16 C:4;  
   uint16 D:4;  
#endif
#if BYTE_ORDER == BIG_ENDIAN
   uint16 D:4;  
   uint16 C:4;  
   uint16 B:4;  
   uint16 A:4;  
#endif
} Attributes;

但这看起来真的很丑。 也许它不是那么可移植。 可能最好使用位掩码和位移位而不是位字段。

位字段排序是依赖于实现的,甚至不需要与目标的基本字节序同步。 通过阵列访问位域甚至更依赖于处理器和编译器。

编写独立代码的唯一机会是将访问权限封装在一组函数中,并在每种编译器/处理器组合上验证是否返回了正确的结果。

我在将代码从Freescale S12X移植到MPC56xx架构时遇到了同样的问题,这些转换非常乏味但不可避免。 MPC甚至以反方向对一个字中的位进行编号。 去搞清楚!

这仍然不是便携式的,但对我而言,确实对我有很大帮助:)

#ifdef __LITTLE_ENDIAN
#define BITFIELD2(a,b) a;b;
#elif defined(__BIG_ENDIAN)
#define BITFIELD2(a,b) b;a;
#else
#error cannot decide architecture
#endif

#define BITFIELD3(a,b,c) BITFIELD2(a,BITFIELD2(b,c))
#define BITFIELD4(a,b,c,d) BITFIELD2(a,BITFIELD3(b,c,d))
#define BITFIELD5(a,b,c,d,e) BITFIELD2(a,BITFIELD4(b,c,d,e))
#define BITFIELD6(a,b,c,d,e,f) BITFIELD2(a,BITFIELD5(b,c,d,e,f))

struct
    {
        BITFIELD6(
        uint16 A:3,
        uint16 B:3,  
        uint16 C:3,  
        uint16 D:3,  
        uint16 E:3,  
        uint16 F:1
        )
        BITFIELD5(
        uint16 G:3,
        uint16 H:3,  
        uint16 I:3,  
        uint16 J:3,  
        uint16 K:4
        )
    } Attributes;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM