C#将字节数组转成对应的整数

时间:2023-01-12 07:29:32

C#将字节数组转成对应的整数

public byte[] PM2_5_B = new byte[0x00,0x46];
public short PM2_5;
PM2_5 = BitConverter.ToInt16(PM2_5_B, 0);

在做的一个项目,需将设备传过来的字节数组转成实际值存储下来,Android端直接取出对应字节直接转换没问题,而我后端(.Net)转出来的数却很大,联想到可能是高低位的问题。查找资料后发现果然如此:

BitConvert中源码:

    public static class BitConverter {

// This field indicates the "endianess" of the architecture.
// The value is set to true if the architecture is
// little endian; false if it is big endian.
#if BIGENDIAN
public static readonly bool IsLittleEndian /* = false */;
#else
public static readonly bool IsLittleEndian = true;
#endif
//**********************省略若干************************//
public static unsafe short ToInt16(byte[] value, int startIndex) {
if( value == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.value);
}

if ((uint) startIndex >= value.Length) {
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.startIndex, ExceptionResource.ArgumentOutOfRange_Index);
}

if (startIndex > value.Length -2) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
}
Contract.EndContractBlock();

fixed( byte * pbyte = &value[startIndex]) {
if( startIndex % 2 == 0) { // data is aligned
return *((short *) pbyte);
}
else {
if( IsLittleEndian) {
return (short)((*pbyte) | (*(pbyte + 1) << 8)) ;
}
else {
return (short)((*pbyte << 8) | (*(pbyte + 1)));
}
}
}

}

由代码可见,C#在转换时,根据只读变量 IsLittleEndian(是否从低位到高位),来确定如何转换,故调整代码如下:


public byte[] PM2_5_B = new byte[0x00,0x46];
public short PM2_5;
//判断数据在此计算机结构中存储时的字节顺序
if (BitConverter.**IsLittleEndian**)
{
//由于设备传过来的是高位->低位的顺序,此时需把字节数组翻转一下,以便正常解析
Array.Reverse(PM2_5_B);
}
PM2_5 = BitConverter.ToInt16(PM2_5_B, 0);

调整后即可正确取到实际值。