C# 用两个相邻Byte类型数扩展byte的值域

需求:Socket通信一般传递字节数组,例如:

frameNeedSend = new byte[] { 0xA0, 0xA0, 0xA0, 0xA0, 0xA0 }

但是有时需要传递超过byte值域(0 - 255)范围的数。此时则需要用相邻两个byte数扩展值域

举例说明:

byte a;
byte b;

int c = 600;

a = Convert.ToByte(c >> 8); //此为相邻两个byte类型数的高位
b = Convert.ToByte(c & 0xff); //此为相邻两个byte类型数的低位

//此时 a = 0x02, b = 0x58
//frameNeedSend = new byte[] { 0x02, 0x58 };
//即:0000 0010 0101 1000
//即为十进制数600

 

后面发现在C#语言里,此方法不能扩展为负值

例如:

byte a;
byte b;

int c = -100;

a = Convert.ToByte(c >> 8); //此为相邻两个byte类型数的高位
b = Convert.ToByte(c & 0xff); //此为相邻两个byte类型数的低位

//此时 a = 0x02, b = 0x58
//frameNeedSend = new byte[] { 0x02, 0x58 };
//即:0000 0010 0101 1000
//即为十进制数600

此时会报错:

System.OverflowException:“值对于无符号的字节太大或太小。”

原因在于C#中byte类型是保存一个无符号数,不能取到负数。相对应的JAVA中byte类型是一个有符号数,则上述代码不会报错。

 

这里找了很多方法,都没有解决方案,可以使C#的Byte数组能够保存负数的。

 

后面想到,可能是思路出了问题

可能并不需要纠结,在我们上位机(Socket发送端)保存的值代表多少。因为不管是C#的0 - 255,还是JAVA的-128 - 127。本质都是以二进制补码保存在计算机中的。

因此,我们只需要保证,发送数据帧时,补码相同即可,而无需管他在发送端表现为正数还是负数。

 

举例说明:

-1 在计算机中保存为 1111 1111,即0xFF。

 

posted @ 2020-07-31 15:34  xiaoxinZard  阅读(426)  评论(0)    收藏  举报