在C++中将无符号字符(字节)数组转换为无符号短符号
我有array^ byteArray
,我需要提取Little Endian序列中的字节以生成未签名的short和int。我已经尝试了以下所有我能想到的组合,所以我都在寻求帮助。在C++中将无符号字符(字节)数组转换为无符号短符号
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,但是所生成的短/ INT报告低位字节为0x0B中。较高的字节不受影响。
我想这是一个符号错误,但我似乎无法修复它。
您正在使用托管代码。 Endian-ness是框架知晓的实现细节:
array<Byte>^ arr = gcnew array<Byte> { 1, 2, 3, 4 };
int value = BitConverter::ToInt16(arr, 1);
System::Diagnostics::Debug::Assert(value == 0x302);
框架的假设是否正确取决于数据来自何处。
产生两个8位整数一个16位的int正确的方法是value = static_cast<int16_t>(hibyte) << 8 | lobyte;
你也应该将'hibyte'转换为16位数据类型,否则,如果是8位数据类型,则左移将变成0. – Praetorian
@Praetorian:修正,谢谢。 –
int y = byteArray[i] | byteArray[i + 1] << 8;
是你需要使用的东西。 (也Convert a vector<unsigned char> to vector<unsigned short>见)
你要做到这一点,而不是
int x = UInt32(byteArray[i]) | (UInt32(byteArray[i + 1]) << 8);
你的乘数搞乱的东西了。
奖励积分如果你知道为什么? – John
你正在尝试做一个转变。乘法可以模拟一个班次,但你乘以255不会效仿班次。 –
在MSDN帮助页面上,我发现指示数组01-02-03-04的ToInt16示例产生ToInt16(arr,1)== 0x20。除非我错过了什么。感谢您提供的快速专业知识。 – John
糟糕,对吧。我的错。搞大脑,关闭MS-calc。 – John