打印时UINT16值似乎是“向后”

时间:2009-08-17 15:55:03

标签: c++

我有一个UINT8指针mArray,它通过*(UINT16 *)转换分配信息。 EG:

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 ...

我希望在达到偏移时打印的值是AA FF,但是打印的值是FF AA,而在我的生活中,我无法弄清楚原因。

4 个答案:

答案 0 :(得分:10)

你正在使用一台小端机。

答案 1 :(得分:4)

你没有指定,但我猜你的mArray是一个字节数组而不是UINT16s数组。 你也在小端机器上运行。在小端机器上,字节以与big-endian机器相反的顺序存储。大端的存储方式与人类阅读它们的方式非常相似。

答案 2 :(得分:4)

您可能正在使用在内存中使用“little-endian”数字表示的计算机(例如Intel x86架构)。基本上这意味着任何值的最低有效字节将存储在用于存储值的存储器位置的最低地址处。 See Wikipdia for details

在您的情况下,数字0xAAFF由两个字节0xAA和0xFF组成,其中0xFF是最不重要的字节。因此,little-endian机器将在最低地址存储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,您可能还想查看它。

答案 3 :(得分:2)

这是因为您的计算机的CPU在内存中使用little endian整数表示