You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:15:06