【问题标题】:UINT16 value appears to be "backwards" when printing打印时 UINT16 值显示为“向后”
【发布时间】:2009-08-17 15:55:02
【问题描述】:

我有一个 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 ...

当它到达偏移量时,我期望打印的值是 AA FF,但打印的值是 FF AA,我这辈子都不知道为什么。

【问题讨论】:

  • 我发布的两个答案之一是错误的.....

标签: c++


【解决方案1】:

你正在使用一个小端机器。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可能使用的计算机在内存中使用“小端”表示数字(例如 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(如果它们在您的平台上可用)。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我认为你的意思是小端。这将产生在大端机器上预期的结果 danipepk。
        • 是的,我对键盘有点高兴.. 我更正了帖子,但原因还是一样:还有 enadianness 问题
        • FWIW,字节顺序不是操作系统的属性,而是硬件处理器的属性。 x86 系列处理器都是小端的。 OTOH 正确的处理器,如旧的 68K 系列是大端的。 :)
        猜你喜欢
        • 1970-01-01
        • 2019-04-10
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        • 2018-06-19
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        相关资源
        最近更新 更多