在 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< int16_t >( hibyte ) << 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中将unsigned char类型的int字符串转换为int
c++中定义一个buff为unsigned char 型,如何初始化全为0
ARDUINO 中将一个unsigned char 的数组的数据转化为一个long 型的数