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

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);

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值