C#中int强转byte再转回int无法还原原始值问题咨询
问题根因
核心是C#中int和byte的存储长度、数值范围完全不匹配,直接强转会丢失数据:
int是32位有符号整数,占4个字节,可表示范围为-2147483648~2147483647byte是8位无符号整数,仅占1个字节,可表示范围只有0~255
把int直接强转为byte的过程,会直接把int中除了最低8位之外的所有高位数据全部截断丢弃,根本没有保存原始int的完整信息,后续再转回int自然不可能还原成原始值。
比如测试时随机到的889,实际计算为3*256 + 121 = 889,强转byte时高位代表的数值3会被直接丢弃,只保留最低位的121,转回去自然得到121,和原始值不一致。
正确传输实现
不要用单个byte强转的方式处理,要把int的4个字节完整拆分后再传输,直接用C#内置的BitConverter类即可实现,参考代码:
int originalId = GetUniqueID(); // 将int完整转换为长度为4的字节数组,保留全部数据 byte[] transmitBuffer = BitConverter.GetBytes(originalId); // 此处写入你的字节数组传输逻辑 // 对端收到完整的4字节数据后,按偏移解析回int int receivedId = BitConverter.ToInt32(transmitBuffer, 0);
跨设备传输需要额外注意字节序(大小端)问题:不同硬件架构、操作系统的设备默认字节序可能不同,传输前最好和对端约定统一的字节序标准(比如统一使用大端序),发送、接收时都按约定调整字节顺序,避免高低位错位导致解析错误。
如果需要传输int数组,只需要遍历数组中每个int,逐个拆为4字节按顺序拼接成总的传输字节数组即可,对端接收后按每4个字节为一组解析,就能完整还原所有原始整数值。
内容的提问来源于stack exchange,提问作者StuckInPhDNoMore
相关产品推荐
相关产品推荐

