MessagePack 编解码器
MessagePack 二进制序列化格式编码与解码
粘贴从 API 响应、日志文件或网络抓包中获取的 MessagePack 数据
点击插入示例数据
解码结果
输入 MessagePack 数据并点击解码查看结果
字节查看器
输入有效的 JSON 数据以编码为 MessagePack
容器长度编码
- Compact: 使用最小字节(≤15 个元素时使用 fixarray/fixmap)
- Explicit 16-bit: 始终使用 2 字节长度(array16/map16 格式)
- Explicit 32-bit: 始终使用 4 字节长度(array32/map32 格式)
点击插入 JSON 示例
编码结果
输入 JSON 数据并点击编码生成 MessagePack
字节查看器
编码统计
MessagePack 数据类型参考
| 类型名称 | 格式字节范围 | 说明 |
|---|---|---|
| 正定长整数 | 0x00-0x7F | 0 到 127 的整数(单字节) |
| 负定长整数 | 0xE0-0xFF | -32 到 -1 的整数(单字节) |
| 定长映射 | 0x80-0x8F | 包含 0-15 个键值对的映射 |
| 定长数组 | 0x90-0x9F | 包含 0-15 个元素的数组 |
| 定长字符串 | 0xA0-0xBF | 长度为 0-31 字节的字符串 |
| 空值 | 0xC0 | 表示 null/nil 值 |
| 布尔值 | 0xC2-0xC3 | True (0xc3) 或 False (0xc2) |
| 二进制 | 0xC4-0xC6 | 原始二进制数据(bin8/bin16/bin32) |
| 扩展类型 | 0xC7-0xC9, 0xD4-0xD8 | 带类型码的应用自定义类型 |
| 浮点数 | 0xCA-0xCB | 32 位或 64 位浮点数 |
| 无符号整数 | 0xCC-0xCF | 8/16/32/64 位无符号整数 |
| 有符号整数 | 0xD0-0xD3 | 8/16/32/64 位有符号整数 |
| 字符串 | 0xD9-0xDB | UTF-8 字符串(str8/str16/str32) |
| 数组 | 0xDC-0xDD | 16 位或 32 位长度的数组 |
| 映射 | 0xDE-0xDF | 16 位或 32 位长度的映射 |
MessagePack 协议文档
MessagePack 简介
MessagePack 是一种高效的二进制序列化格式。由古橋貞之于 2008 年创建,它将类 JSON 的数据结构打包成紧凑的二进制表示,通常比 JSON 小 50%,同时解析速度更快。该格式被 Redis、Fluentd 以及众多对性能要求较高的实时通信系统广泛采用。
二进制编码结构
MessagePack 采用类型-长度-值(TLV)编码方案。第一个字节(格式字节)决定数据类型,对于小整数和短字符串可能直接包含值本身。较大的值使用额外字节存储长度和数据载荷。这种设计使得 MessagePack 能够极其高效地编码小值,同时也支持大型数据结构。
| 格式字节 | 含义 |
|---|---|
| 0x00-0x7F | 正定长整数(0-127,值在字节中) |
| 0x80-0x8F | 定长映射(0-15 对,计数在低 4 位) |
| 0x90-0x9F | 定长数组(0-15 元素,计数在低 4 位) |
| 0xA0-0xBF | 定长字符串(0-31 字节,长度在低 5 位) |
| 0xC0-0xDF | Nil、布尔、bin、ext、float、int 类型 |
| 0xE0-0xFF | 负定长整数(-32 到 -1) |
MessagePack 与 JSON 对比
两种格式表示相同的数据模型,但针对不同场景进行了优化。MessagePack 优先考虑紧凑体积和解析速度,非常适合高吞吐量系统。JSON 优先考虑人类可读性和跨平台的通用兼容性。
- 比 JSON 小 30-50%
- 原生支持二进制数据
- 序列化和解析速度更快
- 类型安全,区分不同整数类型
- 人类可读可编辑
- 浏览器和编程语言普遍支持
- 调试和日志记录更方便
常见应用场景
- Redis 数据序列化和缓存
- 实时通信协议(游戏、聊天)
- Fluentd 日志聚合与转发
- RPC 框架(MessagePack-RPC)
- 带宽受限的移动和嵌入式应用
扩展类型
MessagePack 支持应用自定义的扩展类型。每个扩展包含一个类型码(-128 到 127 的整数)和二进制载荷。常见的标准扩展包括时间戳(类型 -1),用于存储秒和纳秒以实现精确的时间表示。
| 类型码 | 常见用途 |
|---|---|
| -1 | 时间戳(官方标准) |
| 0-127 | 应用自定义类型 |