你确定你的值数组中的每个值都适合 Int16 吗?
如果不是这样,即使您取消选择,结果也不是您想要的。首先,您需要决定如果 values[0] 或者 values
1 大于 Int16 的限制该怎么办。
您的决定取决于这些值的含义。values[0] 是否代表您的结果Int32的最高 16 位,而values[1] 是最低 16 位?
在这种情况下,如果任一 values[0] 或 values
1 超过 Int16.MaxValue,那么您应该抛出 ArgumentException。之后,您的代码就很简单了:
if (values[0] > Int16.MaxValue || values[1] > Int16.MaxValue)
throw new ArgumentException("values should fit in two bytes");
Int32 result = values[0] << 0x10000 + values[1];
return result;
这也可能意味着允许两个值都大于0x10000,如果数字太大,您应该考虑自己想要什么结果。
顺便说一下,如果您的值分别表示Int32的一半,请考虑切换values[0]和values1的含义。几乎总是最不重要的位(LSB)在[0]中,而最重要的位(MSB)在1中。如果您遵循此约定,则无需编写这些转换器,可以使用BitConverter类。
Int32 original = 0x12345678;
byte[] bytes = BitConverter.GetBytes(original);
foreach (var b in bytes)
Console.WriteLine(b.ToString("02X");
Int16[] Values = new Int16[]
{
BitConverter.ToInt16(bytes),
BitConverter.ToInt16(bytes, 2),
};
Int32 result = (Int32)values[0] + (Int32)values[1] << 0x10000;
Debug.Assert(original == result);
listByte.AddRange(BitConverter.GetBytes(shortArr[0])); listByte.AddRange(BitConverter.GetBytes(shortArr[1])); Int32 result = BitConverter.ToInt32(listByte.ToArray());
。 - mrogal.ski