[英]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.