是什么让这段代码“endian独立”?

时间:2010-09-02 16:37:37

标签: c++ c

我遇到了以下代码,并被告知这意味着COL_8888_RED是“endian independent”。为什么?是什么让这个端点独立? (我问过原来的编码员,但是他们没有回复我......他们可能他们也不知道。)

union _colours {
    uint8  c[3][4];
    uint32 alignment;
};

static const union _colours col_8888 = {
        {    /*   B     G     R     A  in memory     */
                {    0x00, 0x00, 0xFF, 0xFF, }, /* red   */
                {    0x00, 0xFF, 0x00, 0xFF, }, /* green */
                {    0xFF, 0x00, 0x00, 0xFF, }, /* blue  */
        }
};

#define COL_8888_RED   *((uint32 *)&col_8888.c[0])

3 个答案:

答案 0 :(得分:11)

在某种意义上,此代码不是“与endian无关”,具有不同endianness的平台将为您提供通过COL_8888_RED看到的不同值。换句话说,在对endian-dependency的传统理解中,这段代码依赖于endian依赖。

另一个问题是应该使用COL_8888_RED的位置。也许它的目的是传递给某些API,它本身依赖于字节序依赖于API的字节序依赖性取消COL_8888_RED的字节序依赖性。在这种情况下,一切都将“按预期”工作,即以字节顺序独立。 (例如,如果API接收颜色值为uint32,然后使用相同的联合将其分隔为ARGB组件,则无论字节顺序如何,它都将获得正确的原始ARGB值。)

但是,要说COL_8888_RED本身的值与字节无关是完全错误的。

答案 1 :(得分:3)

字节数是与所有体系结构无关的字节序。通过将其指定为字节数组,程序员可确保数据的一致内容。也可以在任何架构上单独访问这些字节。如果编码器刚刚制作了3个字的数组,机器字节序将在确定位的确切布局中发挥作用。

答案 2 :(得分:2)

我认为作为宏的COL_8888_RED将始终是uint32,只要始终使用宏COL_8888_RED,源字节数组{0x00,0x00,0xFF,0xFF}将始终转换为程序员想要表示RED。

然后,定义意味着您可以在大端或小端机器上编写相同的源代码,并从离散数组转换为逻辑颜色。

编辑:为什么然后,不使用枚举,或像“1”这样的常量?

原始API开发人员可能希望能够在内存中指向{0x00,0x00,0xFF,0xFF}的另一个位置,以便可以编写如下代码:

uint8 *p = malloc( sizeof(uint8)*4 );

fread( p, sizeof(uint8), 4, inBuff );

if( *((uint32 *)p) == COL_8888_RED )
{
    printf( "I read red!\n" );
}