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 @   xiaoxinZard  阅读(376)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示