跳到主内容
UniKit

Protobuf 查看

不需要 .proto 文件即可解析 Protocol Buffers 二进制数据:按字段号展示 varint(含 zigzag)、fixed32/64、长度前缀字段,并对长度前缀内容递归尝试嵌套消息、可打印字符串或十六进制字节。

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

解析结果

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

选中节点

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

JSON 视图

同一字段号重复出现时聚合为数组;字节串写作 0x…,超出安全范围的整数以字符串表示。

这个工具能做什么

  • 抓包或日志里只有一段二进制,没有 .proto 文件,先粘进来看看字段号和内容,再决定要不要找 schema。
  • 调试 gRPC 或 Kafka 里的 protobuf 消息:确认某个字段到底传了什么,字段号是否和接口文档一致。
  • 核对序列化结果:把十六进制字节解成树,对比 JSON 视图,快速判断 packed repeated 字段有没有按预期打包。
  • 逆向第三方接口时按字段号猜字段含义,长度前缀字段会先尝试嵌套消息、再试可打印文本,省去手工切字节。

示例

输入

08 96 01 12 07 74 65 73 74 69 6e 67

输出

{
  "1": 150,
  "2": "testing"
}

字段 1 是 varint(0x96 0x01 = 150),字段 2 是长度前缀字段,内容按 UTF-8 解码出可打印文本 testing。

常见问题

没有 .proto 文件真的能解析吗?

能解析 wire format,但不知道字段真实类型。varint、fixed32/64 和长度前缀都能按协议解出来,长度前缀的内容按「先尝试嵌套消息、再尝试可打印文本、最后退化为十六进制」判断,所以类型标签是推断而不是权威结论。

varint 旁边的 zigzag 是什么?

sint32 / sint64 会用 zigzag 编码把负数映射成小的正整数,解析时无法区分两者,所以两个值都显示:原值用于 uint32 / uint64 / int32 / int64,zigzag 值用于 sint 类型。

为什么 packed repeated 字段显示成字节串?

packed 编码把一串数字塞进一个长度前缀字段,没有 schema 时无法知道里面是几个字节的元素还是别的数据,工具只能按字节串展示,这是预期行为。

报「不是合法的 protobuf 数据」是什么原因?

常见原因:字节被截断(长度前缀声明的长度超过剩余字节)、字段号或 wire type 非法(字段号 0、wire type 6/7)、varint 超过 10 字节、分组没有闭合。粘贴时漏掉或多写字节都会触发。

数据会被上传吗?

不会。解析完全在浏览器里用 JavaScript 完成,页面不发任何请求,敏感的二进制数据不会离开本机。

关键词:protobufprotocol bufferswire formatvarintzigzagdecodebinaryProtobuf 解码字段号二进制解析序列化gRPC

同类工具