0

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

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

4

5 回答 5

3

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

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

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

于 2011-09-24T22:54:23.740 回答
2

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

于 2011-09-24T22:45:06.433 回答
1
int y = byteArray[i] | byteArray[i + 1] << 8;

是你需要使用的。(另请参阅将 vector<unsigned char> 转换为 vector<unsigned short>

于 2011-09-24T22:45:30.747 回答
0

你想这样做

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

你的乘数把事情搞砸了。

于 2011-09-24T22:46:22.407 回答
0

您必须将第二个字节与0x0100而不是0x00ff.

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

于 2011-09-24T22:47:04.057 回答