⭐ 觉得好用?收藏备用,下次直接打开
字段模板 一行一字段:名称 长度 类型 [修饰符]
HEX 数据
字段解析 点字段行 / 字节高亮联动 · 可编辑「值」后点「← 编码」
名称类型字节偏移
粘贴 HEX 后点「解析」

HEX 协议帧编解码 面向私有软硬件通讯协议:你用一套极简模板描述报文的字段结构,工具就能把十六进制数据双向地拆成字段表、或把字段值拼回报文。校验位和长度字段自动计算,全程浏览器本地运行、不上传。

模板怎么写

每行一个字段,格式为 名称 长度 类型 [修饰符]# 之后是注释:

addr   1    uint              # 从站地址
func   1    uint              # 功能码
len    1    uint              # 后续数据长度
data   len  ascii             # 变长,长度 = len 字段的值
crc    2    crc16/modbus le   # CRC,低字节在前
说明
名称字段名,唯一;可被后面字段引用作长度,或被校验范围引用
长度字节数 / 引用前面 uint·int 字段名(变长)/ *(吃掉剩余全部字节)
类型见下表
修饰符字节序(be le,float 还支持 abcd dcba badc cdab)、校验范围 range(a..b)、缩放 *0.1、偏移 +100、单位 ~℃、枚举 {3:读,6:写}

字段类型

类型含义
uint / int无符号 / 有符号整数(补码),固定长度
hex原始字节,按十六进制显示
ascii / utf8文本,不可见字符显示为 ·
float / doubleIEEE754 单 / 双精度浮点
bcd压缩 BCD 码
bool非零即 true
bits位域,用 > 名称 位数 缩进续行拆位
skip保留 / 占位字节
crc16/modbus crc16/ccitt crc16/xmodem crc8 sum xor内置校验,编码时自动算、解析时自动比对
crc(poly=…,init=…,refin,refout,xorout=…)自定义 CRC,位宽由字段字节数决定,覆盖非标准变体

浮点字节序速查(Modbus 踩坑点)

同一个浮点值 1.0(标准大端 3F 80 00 00)在不同设备上可能是:

修饰符字节排列常见于
abcd3F 80 00 00标准大端
dcba00 00 80 3F标准小端
badc80 3F 00 00字内字节交换
cdab00 00 3F 80字交换(很多 Modbus PLC)

读出来不对就逐个试,能得到合理数值的那个就是设备实际用的字序。

双向用法

  • 解析(→):左边写模板,右边贴 HEX,点「解析 →」。下方按字段拆解,鼠标移到某字段行或某字节,二者高亮联动。
  • 编码(←):在字段表的「值」列填入各字段内容,点「← 编码」拼回完整报文。校验位(CRC/sum/xor)和被引用的长度字段会自动计算回填,无需手动。

局限与注意

  • 内置校验是标准参数crc16/modbus 等内置项用各算法的标准多项式与初值;若设备用了非标准初值/反转/异或输出,改用通用形式 crc(poly=…,init=…,refin,refout,xorout=…) 自定义即可,几乎覆盖所有 CRC 变体。
  • 整数最大 8 字节:超过 64 位的整数字段请用 hex 类型自行处理。
  • 位域按高位在前bits 子项从最高有效位向低位排列,跨字节时按字段整体字节序读取。
  • 结果仅供调试参考,实际收发请以设备文档和真机验证为准。

📍使用场景

  • 拆解私有串口/TCP 报文手上有一段不知道怎么分段的十六进制抓包,按设备文档写好字段模板,粘进来就能看到每个字段的偏移、原始字节和解析值。
  • 构造测试帧发给设备调试时要手动发一条指令,填好各字段的值点「编码」,CRC 和长度字段自动算好,直接复制 HEX 丢到串口助手。
  • 核对 Modbus 浮点字序同一个寄存器在不同 PLC 上浮点字节序不一样(ABCD/CDAB…),切一下 float 的字序修饰符立刻看出哪种排列读出来的温度才正常。
  • 验证校验位对不对怀疑对端 CRC 算错,把整帧贴进来,校验字段会显示实际值与期望值是否一致,✗ 时直接给出应有的校验值。

常见问题

这个工具和「Hex 二进制查看」「Protobuf 解码」有什么区别?

hex-viewer 是按文件格式(PNG/ZIP 等已知魔数)解析,protobuf-decoder 针对 protobuf 这一种自描述格式。本工具面向没有标准、各家自定义的私有通讯协议——你用模板告诉它字段怎么排,它就怎么拆,并且能反向拼回报文。适合嵌入式、串口、Modbus、物联网设备这类"协议在文档里、不在代码里"的场景。

模板语法是什么?最少要写什么?

一行一个字段:名称 长度 类型 [修饰符]# 后面是注释。比如 addr 1 uintcrc 2 crc16/modbus。长度填字节数;变长字段把长度写成前面某个 uint 字段的名字(如 data len ascii);最后一个字段想吃掉剩余全部字节就写 *。修饰符可选,用来指定字节序或校验范围。

变长字段(长度在报文里)怎么处理?

把存放长度的字段先声明出来(通常是 uint),再让变长字段的"长度"列引用它的名字。例如 len 1 uint 后面跟 data len hex——解析时先读出 len 的值,再据此截取 data反向编码时更省事:你只填 data 的内容,len 字段会自动算成 data 的字节数回填,不用手动数。

浮点数读出来不对 / 全是乱码怎么办?

九成是字节序问题。工业设备的 32 位浮点经常不是标准大端,而是"字内交换"或"字交换"。在 float 字段后面试 abcd(标准大端)、dcba(小端)、badccdab(Modbus 设备最常见)四种排列,哪种读出来是合理数值就用哪种。双精度 doublebe/le 即可。

支持哪些校验算法?校验范围怎么定?

内置 crc16/modbus(0xA001,初值 0xFFFF)、crc16/ccitt(CCITT-FALSE,0x1021,初值 0xFFFF)、crc16/xmodem(0x1021,初值 0x0000)、crc8(0x07,SMBus)、sum(累加和取低 8/16 位)、xor(逐字节异或,即 LRC)。注意 ccitt 与 xmodem 多项式相同但初值不同,是两种算法。非标准 CRC 用通用形式 crc(poly=0x1021,init=0xFFFF,refin,refout,xorout=0),位宽由字段字节数决定(只有 poly 必填,其余缺省为 0/false),几乎能覆盖所有 CRC 变体。默认校验从帧首到该校验字段之前的所有字节;如果你的协议只校验中间一段,用修饰符 range(起字段..止字段) 指定起止字段名(含两端)。编码时校验值永远自动算,解析时会比对实际值与期望值并标 ✓/✗。

寄存器值带系数(如温度=原值×0.1)或功能码想显示名字,怎么做?

用数值修饰符,可叠加在 uint/int/float 字段后面:缩放 *0.1、偏移 +100、单位 ~℃、枚举 {3:读寄存器,6:写寄存器}。例如 temp 2 uint *0.1 ~℃,原始 00 FA(250)直接显示成 25 ℃func 1 uint {3:读寄存器,6:写寄存器} 会把 03 显示成 读寄存器(3)反向编码时「值」列直接填物理量(如 25 ℃读寄存器),工具自动还原成原始字节,不用手算。注意枚举标签里不能含逗号或大括号(逗号是分隔符)。

位域(一个字节拆成几个状态位)能拆吗?

能。写一个 bits 类型字段,下面用 > 名称 位数 缩进续行逐位声明,从高位到低位排列。例如 status 1 bits 下面跟 > online 1> mode 2> reserved 5。解析时每位单独列出;编码时在该字段的值里写 online=1 mode=2 这种形式即可。

我的模板能保存下来下次用吗?

能。写好模板点「💾 存模板」起个名字,就存进浏览器本地(localStorage),下次从左上角下拉里选回来。内置的几个示例(Modbus-RTU、TLV、传感器浮点)可以直接当模板改。数据只在你这台机器上,不上传。

数据会上传吗?能离线用吗?

不会上传,可以离线用。 模板解析、编解码、CRC 计算全部在浏览器本地完成,不发起任何网络请求。把页面打开后断网照常工作,适合处理内部设备的敏感协议数据。