Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将C+中的无符号字符(字节)数组转换为无符号短字符+;_C++_Arrays_Unsigned_Unsigned Char - Fatal编程技术网

C++ 将C+中的无符号字符(字节)数组转换为无符号短字符+;

C++ 将C+中的无符号字符(字节)数组转换为无符号短字符+;,c++,arrays,unsigned,unsigned-char,C++,Arrays,Unsigned,Unsigned Char,我有array^byteArray,我需要提取小尾端序列中的字节,以生成无符号的short和int。我已经尝试了以下我能想到的每一个组合,所以我请求帮助 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] +

我有
array^byteArray
,我需要提取小尾端序列中的字节,以生成无符号的short和int。我已经尝试了以下我能想到的每一个组合,所以我请求帮助

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


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

从两个8位整数生成16位整数的正确方法是
value=static\u cast(hibyte)从两个8位整数生成16位整数的正确方法是
value=static\u cast(hibyte)
int y=byteArray[I];byteArray[I+1]
int y=byteArray[i]| byteArray[i+1]您想这样做吗

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

int x=UInt32(byteArray[i])|(UInt32(byteArray[i+1])您想这样做吗

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

int x=UInt32(byteArray[i])|(UInt32(byteArray[i+1])您必须将第二个字节乘以
0x0100
,而不是
0x00ff


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

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


这就像在十进制系统中,用10乘以10,而不是9。

您使用的是托管代码。Endian ness是框架知道的一个实现细节:

array<Byte>^ arr = gcnew array<Byte> { 1, 2, 3, 4 };
int value = BitConverter::ToInt16(arr, 1);
System::Diagnostics::Debug::Assert(value == 0x302);
array^arr=gcnewarray{1,2,3,4};
int值=位转换器::ToInt16(arr,1);
系统::诊断::调试::断言(值==0x302);

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

您使用的是托管代码。Endian ness是框架知道的一个实现细节:

array<Byte>^ arr = gcnew array<Byte> { 1, 2, 3, 4 };
int value = BitConverter::ToInt16(arr, 1);
System::Diagnostics::Debug::Assert(value == 0x302);
array^arr=gcnewarray{1,2,3,4};
int值=位转换器::ToInt16(arr,1);
系统::诊断::调试::断言(值==0x302);

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

即使如此,也不能将字节0x50转换为0x0b。即使如此,也不能将字节0x50转换为0x0b。您还应该将
hibyte
转换为16位数据类型,否则,如果是8位数据类型,左移位将变为将其转换为0。您还应将
hibyte
转换为16位数据类型,否则,如果它是8位数据类型,则左移位将其转换为0。您正在尝试执行移位。乘法可以模拟移位,但您正在乘以255,而255不会模拟移位。您正在尝试执行移位。乘法可以模拟shift,但您将乘以255,这不会模拟移位。在MSDN帮助页面上,我找到了指示数组01-02-03-04的ToInt16示例,该数组的产量为ToInt16(arr,1)==0x20。除非我遗漏了什么。感谢您提供的快速专业知识。在MSDN帮助页面上,我找到了指示数组01-02-03-04产量为ToInt16(arr,1)的ToInt16示例==0x20。除非我错过了什么。感谢您提供的快速专业知识。