MessagePack 解码器
当 JSON 显得太大、protobuf 又显得太繁琐时,服务通常会选择 MessagePack:同样的值,压进字节里。可一旦出问题,这份紧凑就成了障碍——从缓存、队列或日志里取出的负载,不解码根本读不了。 这个工具读取完整格式,并保留 JSON 会丢失的区分。整数按写入时的宽度返回;放不进 JavaScript 数字的 64 位值会保留为字符串,而不是悄悄四舍五入。二进制仍是二进制,不会被压成乱码文本——str 与 bin 的区分是在格式发布之后才加入的,而混淆两者正是解码器损坏数据的典型方式。扩展类型会连同编号一起显示,时间戳扩展的三种编码都能正确解读。 结果以标注类型的树形展示,同时给出 JSON;JSON 无法表达的内容会明确写出而非压平。如果输入中的字节多于一个值所需——多条消息拼接成的流就是这样——它会告诉你还剩多少字节,而不是假装它们不存在。不会上传任何内容。
粘贴 base64 或 hex 的 MessagePack 负载即可解码。
使用方法
- 以 base64 或 hex 粘贴负载——格式会自动识别,也可手动指定。
- 阅读树形结构:每行显示键、MessagePack 类型和取值。
- 需要在别处处理这些值时复制 JSON。
- 拖入二进制文件即可直接解码抓取到的负载。
- 若负载是多条消息的流,请留意剩余字节提示。
常见问题
- str 和 bin 有什么区别?
- MessagePack 起初只有一个 raw 类型,文本和字节共用。2013 年的修订把它拆成用于 UTF-8 文本的 str 和用于任意字节的 bin,否则解码器无从判断该不该把字节当文本解析。把 bin 当作字符串正是二进制数据被破坏的途径,因此这里严格区分两者。
- 为什么大整数在 JSON 里变成了字符串?
- JavaScript 数字只能精确表示到 2^53 的整数。MessagePack 支持完整的 64 位整数,因此超过该上限的值在 JSON 输出中写成字符串——让位数悄悄消失,比这点不便糟糕得多。
- 时间戳是怎么解码的?
- 类型为 -1 的时间戳扩展有三种编码:4 字节的秒、12 字节的纳秒加秒,以及把 30 位纳秒压在 34 位秒之上、共用一个字的 8 字节形式。最后一种是陷阱——当作普通整数来读会得到偏差数万年的日期。
- 剩余字节的提示是什么意思?
- MessagePack 的值是自定界的,所以一个缓冲区里可以接连放多个值。当第一个值先于输入结束时,剩下的通常是另一条消息。这里给出剩余数量,而不是默默忽略。
- 除时间戳外的扩展类型呢?
- 会连同类型编号和 base64 负载一起显示。扩展的含义由写入它的应用定义,因此没有通用的解码目标。
- 我的负载会被上传吗?
- 不会。字节在你的浏览器中解码,不会发送到任何服务器。
相关工具
Plist 查看器(二进制与 XML)
打开苹果属性列表——无论二进制还是 XML——以树形查看,并可转换为 JSON 或 XML plist。
Protobuf 解码器(无需 .proto)
粘贴 base64 或 hex 的 protobuf 字节,无需 schema 即可读出字段编号、wire 类型、嵌套消息、字符串和 packed 数组。
JWT 解码器
解码 JSON Web Token,查看其头部、声明和过期时间。
Hex Dump 查看器
将文本或小文件以 偏移 + hex 字节 + 可打印 ASCII 显示,类似 `xxd` 或 `hexdump -C`。
位运算计算器
对两个整数进行 AND、OR、XOR、NOT 和移位运算 —— 以二进制、十六进制、无符号和有符号十进制显示,可选 8、16、32 或 64 位宽。
ASCII 码表
256 行 ASCII / 扩展 ASCII 表 — 十进制、十六进制、八进制、二进制,以及控制字符名称。可搜索、可复制。