| 名称 | 类型 | 值 | 字节 | 偏移 |
|---|---|---|---|---|
| 粘贴 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 / double | IEEE754 单 / 双精度浮点 |
bcd | 压缩 BCD 码 |
bool | 非零即 true |
bits | 位域,用 > 名称 位数 缩进续行拆位 |
skip | 保留 / 占位字节 |
crc16/modbus crc16/ccitt crc16/xmodem crc8 sum xor | 内置校验,编码时自动算、解析时自动比对 |
crc(poly=…,init=…,refin,refout,xorout=…) | 自定义 CRC,位宽由字段字节数决定,覆盖非标准变体 |
同一个浮点值 1.0(标准大端 3F 80 00 00)在不同设备上可能是:
| 修饰符 | 字节排列 | 常见于 |
|---|---|---|
abcd | 3F 80 00 00 | 标准大端 |
dcba | 00 00 80 3F | 标准小端 |
badc | 80 3F 00 00 | 字内字节交换 |
cdab | 00 00 3F 80 | 字交换(很多 Modbus PLC) |
读出来不对就逐个试,能得到合理数值的那个就是设备实际用的字序。
crc16/modbus 等内置项用各算法的标准多项式与初值;若设备用了非标准初值/反转/异或输出,改用通用形式 crc(poly=…,init=…,refin,refout,xorout=…) 自定义即可,几乎覆盖所有 CRC 变体。hex 类型自行处理。bits 子项从最高有效位向低位排列,跨字节时按字段整体字节序读取。hex-viewer 是按文件格式(PNG/ZIP 等已知魔数)解析,protobuf-decoder 针对 protobuf 这一种自描述格式。本工具面向没有标准、各家自定义的私有通讯协议——你用模板告诉它字段怎么排,它就怎么拆,并且能反向拼回报文。适合嵌入式、串口、Modbus、物联网设备这类"协议在文档里、不在代码里"的场景。
一行一个字段:名称 长度 类型 [修饰符],# 后面是注释。比如 addr 1 uint、crc 2 crc16/modbus。长度填字节数;变长字段把长度写成前面某个 uint 字段的名字(如 data len ascii);最后一个字段想吃掉剩余全部字节就写 *。修饰符可选,用来指定字节序或校验范围。
把存放长度的字段先声明出来(通常是 uint),再让变长字段的"长度"列引用它的名字。例如 len 1 uint 后面跟 data len hex——解析时先读出 len 的值,再据此截取 data。反向编码时更省事:你只填 data 的内容,len 字段会自动算成 data 的字节数回填,不用手动数。
九成是字节序问题。工业设备的 32 位浮点经常不是标准大端,而是"字内交换"或"字交换"。在 float 字段后面试 abcd(标准大端)、dcba(小端)、badc、cdab(Modbus 设备最常见)四种排列,哪种读出来是合理数值就用哪种。双精度 double 用 be/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(起字段..止字段) 指定起止字段名(含两端)。编码时校验值永远自动算,解析时会比对实际值与期望值并标 ✓/✗。
用数值修饰符,可叠加在 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 计算全部在浏览器本地完成,不发起任何网络请求。把页面打开后断网照常工作,适合处理内部设备的敏感协议数据。
名称 长度 类型 [修饰符],# 后为注释*(吃掉剩余全部)be le(float 另支持 abcd dcba badc cdab);校验范围 range(起字段..止字段)*0.1、偏移 +100、单位 ~℃、枚举 {3:读寄存器,6:写寄存器};可叠加,如 temp 2 uint *0.1 ~℃> 名称 位数 缩进续行拆位 skip保留/占位字节 crc16/modbusCRC16-Modbus(0xA001) crc16/ccittCRC16-CCITT-FALSE(0x1021,初值 0xFFFF) crc16/xmodemCRC16-XModem(0x1021,初值 0x0000) crc8CRC-8/SMBus(0x07) sum累加和(取低 8/16 位) xor逐字节异或(LRC) crc(…)自定义 CRC:crc(poly=0x1021,init=0xFFFF,refin,refout,xorout=0),位宽由字段字节数决定(仅 poly 必填) range(addr..data) 指定起止字段(含两端)