关于byte的一些操作,非常有用的。

1、将byte转为对应的0/1数组

不多说,直接看代码:

public static byte[] byteToArray(byte bt)
{
    byte[] array = new byte[8];//用于存储每位的值
    for(int i = 7; i >= 0; i--)
    {
        array[i] = (byte)(bt & 1);//强转
        bt = (byte)(bt >> 1);//右移1位
    }
    return array;
}

2、判断byte最高位的符号

在一些场景中,我们需要一位来确定某个数的符号,通常选用最高位来做符号位,如温度有正负,在保存温度数据时,需要考虑正负,所以采用最高位来作为符号位,设最高位为0时,温度为正,否则为负。如何判断呢?采用按位与的方法,只需看最高位与1相与的结果,其他位不管。

我这里采用的方式是,将byte值与0x80相与,然后与0x80相比,如果相等,则说明最高位为1否则0

代码实现判断最高位

public static byte JudgeTempPositiveOrNegative(byte b)
{
    //&是按位与之后的结果,所以最后要和本身【0x80】做比较
    if ((b & 0x80) == 0x80)//如果温度最高位是1,即为负数情况
    {
        Console.WriteLine("最高位为1");
        b = (byte)(b & 0x7F);//将b的最高位变为0,其他位不变
        Console.Write("最高位已改为0");
        return b;
    }
    else //如果温度最高位是0,为正数,则什么也不做
    {
        Console.Write("最高位为0");
        return b;
    }          
}

3、分离byte高低4位

前面用温度举例,现在继续用温度来讲,我们要解析出具体的温度值,如1100 1001,最高位为1,为负数,高4位为1100,数值位为100,对应十进制值为4;低4位为1001,对应十进制值为9。所以1100 1001在这种规则下转为十进制数为-49

代码实现分离高低4位,并存于数组中

public static int[] SeparatingHighAndLowBits(byte b)
{
    int[] HL = new int[2];//一个2位的数组,用于存获取到的高低位值
    var high = (b & 0xF0) >> 4;//高位
    var low = b & 0x0F;//低位
    HL[0] = high;
    HL[1] = low;
    return HL;//返回数组
}

要实现温度的分离,还需要使用到上面判断最高位符号的代码,这里就不操作了。

4、分离byte高低4位并求和

在我们传输数据过程中,需要校验,如果采用累加和校验方式,就要用到分离字节高低4位的方法。

只需要在上面代码中修改部分即可。

public static int SumHighAndLowBits(byte bt)
{
    var high = (bt & 0xF0) >> 4;//高位
    var low = bt & 0x0F;//低位 
    return high+low;//返回数组
}