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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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