我有一个UINT8指针mArray,它是通过*(UINT16 *)强制转换来分配信息的。例如:
int offset = someValue;
UINT16 mUINT16 = 0xAAFF
*(UINT16 *)&mArray[offset] = mUINT16;
for(int i = 0; i < mArrayLength; i++)
{
printf("%02X",*(mArray + i));
}
output: ... FF AA ...
expected: ... AA FF ...当它到达offset时,我期望打印的值是AA FF,但打印的值是FF AA,并且对于我的生命,我不知道为什么。
发布于 2009-08-17 15:56:25
您正在使用一台小型的endian机器。
发布于 2009-08-17 15:58:10
您没有指定,但我猜您的mArray是一个字节数组,而不是一个UINT16s数组。您还可以在一台小端机器上运行。在小端机器上,字节的存储顺序与大端机器相反。大字节序存储它们的方式与人类读取它们的方式大致相同。
发布于 2009-08-17 16:36:23
您可能正在使用的计算机使用内存中数字的“小端”表示法(如英特尔x86体系结构)。基本上,这意味着任何值的最低有效字节将存储在用于存储值的内存位置的最低地址。See Wikipdia for details。
在您的示例中,数字0xAAFF由两个字节0xAA和0xFF组成,其中0xFF是最低有效字节。因此,小端机器将在最低地址存储0xFF,然后存储0xAA。因此,如果将写入UINT16值的内存位置解释为UINT8,则会得到写入该位置的字节,该位置恰好为0xFF
如果您希望将UINT16值的数组写入到大小适当的UINT8值数组中,以便输出符合您的预期,则可以按以下方式完成:
/* copy inItems UINT16 values from inArray to outArray in
* MSB first (big-endian) order
*/
void copyBigEndianArray(UINT16 *inArray, size_t inItems, UINT8 *outArray)
{
for (int i = 0; i < inItems; i++)
{
// shift one byte right: AAFF -> 00AA
outArray[2*i] = inArray[i] >> 8;
// cut off left byte in conversion: AAFF -> FF
outArray[2*i + 1] = inArray[i]
}
}您可能还想查看hton*/ntoh*-family of functions,如果它们在您的平台上可用。
https://stackoverflow.com/questions/1288761
复制相似问题