【问题标题】:Convert array of unsigned char (byte) into unsigned short in C++在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short
【发布时间】:2011-09-24 22:42:02
【问题描述】:

我有array^ byteArray,我需要提取 Little Endian 序列中的字节以制作无符号短裤和整数。我已经尝试了以下我能想到的所有组合,因此寻求帮助。

int x = UInt32(byteArray[i]) + (UInt32)(0x00ff) * UInt32(byteArray[i + 1]);
int x = UInt32(byteArray[i]) + UInt32(0x00ff) * UInt32(byteArray[i + 1]);
int x = byteArray[i] + 0x00ff * byteArray[i + 1];

问题是最低有效字节(在 i+1 处)我知道它是 0x50,但生成的 short/int 将低字节报告为 0x0b。高字节不受影响。

我认为这是一个标志错误,但我似乎无法修复它。

【问题讨论】:

    标签: c++ arrays unsigned unsigned-char


    【解决方案1】:

    您正在使用托管代码。字节序是框架知道的一个实现细节:

    array<Byte>^ arr = gcnew array<Byte> { 1, 2, 3, 4 };
    int value = BitConverter::ToInt16(arr, 1);
    System::Diagnostics::Debug::Assert(value == 0x302);
    

    框架的假设是否正确取决于数据的来源。

    【讨论】:

    • 在 MSDN 帮助页面上,我发现 ToInt16 示例指示数组 01-02-03-04 产生 ToInt16(arr, 1) == 0x20。除非我错过了什么。感谢您提供快速的专业知识。
    【解决方案2】:

    从两个 8 位整数生成 16 位整数的正确方法是 value = static_cast&lt; int16_t &gt;( hibyte ) &lt;&lt; 8 | lobyte;

    【讨论】:

    • 还要将hibyte转换成16位数据类型,否则如果是8位数据类型,左移会变成0。
    【解决方案3】:
    int y = byteArray[i] | byteArray[i + 1] << 8;
    

    是您需要使用的。 (另见Convert a vector<unsigned char> to vector<unsigned short>

    【讨论】:

      【解决方案4】:

      您想改为这样做

      int x = UInt32(byteArray[i]) | (UInt32(byteArray[i + 1]) << 8);
      

      你的乘数搞砸了。

      【讨论】:

      • 您正在尝试换班。乘法可以模拟班次,但您乘以 255 不会模拟班次。
      【解决方案5】:

      您必须将第二个字节乘以 0x0100 而不是 0x00ff

      这就像在十进制系统中,你乘以十,而不是九。

      【讨论】:

      • 即使这样也不能将字节 0x50 变成 0x0b。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 2019-04-16
      • 1970-01-01
      • 2012-12-22
      • 2015-01-20
      相关资源
      最近更新 更多