2011-09-24 186 views
0

我有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中。较高的字节不受影响。

我想这是一个符号错误,但我似乎无法修复它。

回答

3

您正在使用托管代码。 Endian-ness是框架知晓的实现细节:

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

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

+0

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

+0

糟糕,对吧。我的错。搞大脑,关闭MS-calc。 – John

2

产生两个8位整数一个16位的int正确的方法是value = static_cast<int16_t>(hibyte) << 8 | lobyte;

+0

你也应该将'hibyte'转换为16位数据类型,否则,如果是8位数据类型,则左移将变成0. – Praetorian

+0

@Praetorian:修正,谢谢。 –

0

你要做到这一点,而不是

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

你的乘数搞乱的东西了。

+0

奖励积分如果你知道为什么? – John

+0

你正在尝试做一个转变。乘法可以模拟一个班次,但你乘以255不会效仿班次。 –

0

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

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

+0

即使这样也不会使0x50的字节成为0x0b。 – John

相关问题