跳到正文

Protobuf 解码

Protobuf Decoder

没有 .proto 文件也能解码 protobuf 数据,推断字段号、wire type 和嵌套结构。

不用 `.proto` 文件解码 protobuf 载荷。它读线路格式——字段号、wire type、嵌套——并把每个值所有合法的读法并排显示,因为没有 schema 的时候读法确实不止一种。

🔒 完全在你的浏览器里运行protobufdecodebinarygrpc

负载

把二进制负载拖进来

在这个标签页里解码,什么都不会上传。

字段

顶层字段

3

总大小

17 B

  • #1VARINT@0, 3 Buint 150 · zigzag 75
  • #2LEN@3, 9 B"testing"
  • #3LEN@12, 5 B消息(1个字段)
    • #1VARINT@0, 3 Buint 150 · zigzag 75

当作 JSON 看(名字的位置放字段号)

没有 .proto 文件就没有字段名,同一段负载可以有几种成立的读法:varint 会同时按无符号、有符号和 zigzag 三种给出,带长度的字段会按消息、文本、字节三种给出。画面上的嵌套是每个字节都刚好对齐的那种读法;别的读法印在旁边,不藏起来。

怎么用

  1. 粘贴字节或拖入文件

    带空格或不带空格的十六进制,或 Base64。也可以改为拖入一个最大 32 MB 的二进制文件。

  2. 读字段列表

    每一行给出字段号、wire type、字节偏移和长度,以及各种读法。嵌套消息缩进在它的父级下面。

  3. 拿 JSON 投影

    同一棵树的 JSON 形式,用字段号代替名字。适合对比两份载荷,或者粘进 issue 里。

常见问题

为什么没有字段名?

因为 protobuf 不把它们放到线路上。编码后的消息只带字段*号*——名字在 `.proto` 文件里,这正是这种格式紧凑的原因,也正是无 schema 解码只能给你看数字的原因。

为什么一个值显示了三种不同的样子?

因为线路上的 varint 只是一串位:同样的字节既是合法的 `uint64`,也是合法的 `int64`,也是合法的 zigzag `sint64`,只有 schema 才说是哪一种。显示一种、藏起其他的,就是把猜测当事实呈现。

它怎么判定一个字段是嵌套消息?

一个带长度前缀的字段可以是消息、字符串或原始字节。当它的内容能完整解析——每个字节都被消耗,没有剩余——就显示为消息,字节同时也是可打印文本时,字符串读法会一并打印在旁边。偶尔一个短字符串会碰巧解析成消息;两种读法都在,你能分辨。

它能解码 gRPC 流量吗?

消息体可以,前提是你先把前面五个字节的 gRPC 帧头——一个压缩标志和一个四字节大端长度——去掉。把那之后的字节喂进来,它就正常解码。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。