首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印时,UINT16值显示为“反向”

打印时,UINT16值显示为“反向”
EN

Stack Overflow用户
提问于 2009-08-17 15:55:03
回答 4查看 1.8K关注 0票数 2

我有一个UINT8指针mArray,它是通过*(UINT16 *)强制转换来分配信息的。例如:

代码语言:javascript
复制
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,并且对于我的生命,我不知道为什么。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-17 15:56:25

您正在使用一台小型的endian机器。

票数 10
EN

Stack Overflow用户

发布于 2009-08-17 15:58:10

您没有指定,但我猜您的mArray是一个字节数组,而不是一个UINT16s数组。您还可以在一台小端机器上运行。在小端机器上,字节的存储顺序与大端机器相反。大字节序存储它们的方式与人类读取它们的方式大致相同。

票数 4
EN

Stack Overflow用户

发布于 2009-08-17 16:36:23

您可能正在使用的计算机使用内存中数字的“小端”表示法(如英特尔x86体系结构)。基本上,这意味着任何值的最低有效字节将存储在用于存储值的内存位置的最低地址。See Wikipdia for details

在您的示例中,数字0xAAFF由两个字节0xAA和0xFF组成,其中0xFF是最低有效字节。因此,小端机器将在最低地址存储0xFF,然后存储0xAA。因此,如果将写入UINT16值的内存位置解释为UINT8,则会得到写入该位置的字节,该位置恰好为0xFF

如果您希望将UINT16值的数组写入到大小适当的UINT8值数组中,以便输出符合您的预期,则可以按以下方式完成:

代码语言:javascript
复制
/* 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,如果它们在您的平台上可用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1288761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档