在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short

Posted

技术标签:

【中文标题】在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short【英文标题】:Convert array of unsigned char (byte) into unsigned short in C++ 【发布时间】: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。高字节不受影响。

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

【问题讨论】:

【参考方案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。

以上是关于在 C++ 中将 unsigned char (byte) 数组转换为 unsigned short的主要内容,如果未能解决你的问题,请参考以下文章

C++中将对象this转换成unsigned char指针

如何在python中将unsigned char类型的int字符串转换为int

c++中定义一个buff为unsigned char 型,如何初始化全为0

ARDUINO 中将一个unsigned char 的数组的数据转化为一个long 型的数

将 System::String^ 转换为 unsigned char*

C++怎么将 CString 转换成 unsigned char 的数组