2016-03-04 55 views
2

我正在使用使用結構來表示數組(並允許在訪問結構時填充該數組)的API。以十六進制打印數組與整數

如果數據是一個結構對象,並且方向是uint32_t的,運行以下:

printf("0x%08X", data->magic); 

我得到的值:0xAAAABEEF

在打印陣列直接作爲例如:

printf("0x"); 
for (int i = 0; i < size; ++i) { 
    printf("%02X", payload[i]); 
} 

我得到的值:0xEFBEAAAA

結構定義如下所示:

struct Data { 
    uint32_t magic; 
} __attribute__((packed)); 

我相信數據變量聲明是這樣的:

// Declared and initialized somewhat like this: 
uint8_t payload[kMaxSize]; 
Data* data = reinterpret_cast<Data*>(payload); 
data->magic = 0xAAAABEEF; 

我很好奇,爲什麼printf的不返回相同的值。是否因爲機器將數據存儲爲LSB(最低有效字節)?

回答

5

你的猜測是正確的。在little-endian processor(例如:x86)中,最低有效字節首先存儲在內存中。因此,數0xAAAABEEF將被存儲爲四個字節內存:{0xEF, 0xBE, 0xAA, 0xAA}

當你的程序會在內存的四個字節,解釋數據的方式 - 它 - 決定了它的外觀。如果{0xEF, 0xBE, 0xAA, 0xAA}被解釋爲單個字節,則會得到「EF BE AA AA」。但是,如果它被解釋爲uint32_t,那麼計算機知道要顛倒順序並將其顯示爲「0xAAAABEEF」。

+0

非常感謝!如果這是一個微不足道的問題,表示歉意;我對我的理解深感懷疑 - 謝謝你的明確解釋。 – Jary