Socket接收CNC机床数据需读取十六进制而非ASCII的问题求解
解决方法
核心错误
- 将字节数组转成连续十六进制字符串属于多余操作,不需要做这一步,直接基于原始
buffer字节数组解析双字节值即可,转字符串反而会增加解析成本和出错概率 - 未处理字节序(大小端):工业CNC设备的Socket通信绝大多数默认采用大端序(高字节在前、低字节在后),而Windows系统默认是小端序,直接按系统默认规则读取会导致高低字节颠倒,拿到的数值不符合预期。
正确实现步骤
1. 确认协议字节序
优先查官方协议确认双字节(Word)的字节序,若没有明确说明,可分别用大端、小端解析后和预期值匹配即可确定。
2. 直接解析原始字节数组
以C#为例,不需要转十六进制字符串,直接从buffer中取对应位置的2个字节解析:
// 手动控制字节序(推荐,兼容性强) // 大端序解析第0位开始的第一个双字节(前2字节) ushort firstWord = (ushort)(buffer[0] << 8 | buffer[1]); // 大端序解析第2位开始的第二个双字节 ushort secondWord = (ushort)(buffer[2] << 8 | buffer[3]); // 若验证为小端序,调换两个字节的位置即可 // ushort firstWord = (ushort)(buffer[1] << 8 | buffer[0]);
也可以用.NET内置类简化操作:
// 引用System.Buffers命名空间 // 大端序解析 ushort firstWord = BinaryPrimitives.ReadUInt16BigEndian(buffer.AsSpan(0, 2)); // 小端序解析 ushort firstWord = BinaryPrimitives.ReadUInt16LittleEndian(buffer.AsSpan(0, 2));
3. 用你提供的示例数据验证
你给出的原始十六进制数据前4字节为00 04 00 01,按大端序解析得到:
- 第一个双字节值:4
- 第二个双字节值:1
按小端序解析得到: - 第一个双字节值:1024
- 第二个双字节值:256
和你协议预期的0/1匹配即可确认正确的字节序。
注意事项
- 不要使用任何
Encoding类将二进制字节转成字符串,工业设备的二进制通信数据不属于文本编码范畴,转ASCII/UTF8只会得到乱码,直接操作原始字节数组是最准确的做法。 - 后续如果遇到4字节的整型、浮点型字段,也是先确认字节序,再对应解析即可。
内容的提问来源于stack exchange,提问作者MonkeyDLuffy
相关产品推荐
相关产品推荐

