跳到主内容
UniKit

MessagePack 查看

在浏览器本地解码 MessagePack 二进制数据:支持 nil / bool / int / float / str / bin / array / map / ext 全部格式族,并以可折叠树展示每个值的类型、字节长度与偏移,附带 JSON 视图。

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

解析结果

粘贴十六进制字节后自动解析

选中节点

粘贴十六进制字节后自动解析

JSON 视图

二进制与 ext 以十六进制字符串表示,超出安全范围的 64 位整数以字符串表示。

这个工具能做什么

  • 调试用 MessagePack 通信的服务:把抓到的二进制载荷转成十六进制粘进来,就能看到每个值的类型、字节长度和在报文里的偏移,比对着 spec 数字节快得多。
  • 确认序列化实现写得对不对:同一份数据自己用代码打包一遍,再和这里的树形视图逐个类型比对,能立刻发现整数被写成了 float 或数组长度前缀用错。
  • 想把二进制数据当 JSON 看:附带的 JSON 视图把 map 转成对象、array 转成数组,二进制与 ext 用 hex 字符串表示,方便直接读或复制走。
  • 排查「多出的字节」:解析结果会显示顶层值占用的字节数和剩余的未解析字节数,接到脏数据时能马上看出是不是还有第二个报文。

示例

输入

82 a1 61 01 a1 62 92 c3 cb 3f f0 00 00 00 00 00 00

输出

{
  "a": 1,
  "b": [
    true,
    1
  ]
}

这是 JSON 视图的输出:样本是一个 fixmap,包含 a → 1 和 b → [true, 1.0](1.0 由 float64 解出)。树形视图里还能看到每个节点的类型标签(fixmap、str、float64 等)与偏移。

常见问题

十六进制要怎么输入?

空白、逗号、分号、冒号和连字符都能当分隔符,也接受 0x 前缀,例如「82 a1 61 01」「82,a1,61,01」「0x82 0xa1」都可以。字符数必须是偶数,出现非十六进制字符会提示格式不正确。

为什么解析报「不是合法的 MessagePack 数据」?

两种典型原因:前缀字节非法(例如 0xc1 在规范里是保留值),或者数据被截断——声明了 4 字节长度却只跟了 2 个字节。嵌套超过 64 层也会被判为非法,这是防止恶意输入打爆调用栈的保护。

这个大整数为什么显示成字符串?

MessagePack 的 int64 / uint64 可以超出 JavaScript 的安全整数范围,直接转成 Number 会丢精度,所以 JSON 视图里超出 ±2^53-1 的整数按字符串输出,树形视图里始终是精确的十进制字符串。

ext 类型是干什么的?timestamp 也会显示吗?

ext 是扩展类型,格式是「1 字节类型号 + 载荷」。它的语义由应用自己约定,本工具只能显示类型号和载荷的十六进制;唯一特判的是类型号 -1,也就是 MessagePack 的 timestamp 扩展,会直接渲染成可读时间。

粘贴的是真实报文,会上传吗?

不会。解码器是页面内自带的 TypeScript 实现,完全在本机运行,页面没有网络请求,报文内容也不会被记录。

关键词:msgpackmessagepackbinarydecodehexserializationextMessagePack 解析二进制查看序列化十六进制树形视图

同类工具