簡體   English   中英

是什么讓這段代碼“endian獨立”?

[英]What makes this code “endian independent”?

我遇到了以下代碼,並被告知這意味着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])

在某種意義上,具有不同字節序的平台將為您提供通過COL_8888_RED看到的不同值,此代碼不是“字節序獨立的”。 換句話說,在對endian-dependency的傳統理解中,這個代碼依賴於endian依賴。

另一個問題是應該使用COL_8888_RED位置。 也許它的目的是傳遞給某些API,它本身依賴於字節序依賴於API的字節序依賴性取消了COL_8888_RED的字節序依賴性。 在這種情況下,一切都將“按預期”工作,即字節獨立。 (例如,如果API接收顏色值為uint32 ,然后使用相同的聯合將其分離為ARGB組件,則無論字節順序如何,它都將獲得正確的原始ARGB值。)

但是,要說COL_8888_RED本身的值與字節無關是完全錯誤的。

字節數是與所有體系結構無關的字節序。 通過將其指定為字節數組,程序員可確保數據的一致內容。 也可以在任何架構上單獨訪問這些字節。 如果編碼器剛剛制作了3個字的數組,則機器字節序將在確定位的確切布局中起作用。

我認為作為宏的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" );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM