2016-03-04 53 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