我用最直白、不绕弯的方式给你讲清楚 Protobuf 里的长度、大端、小端,你马上就能懂。

1. 先一句话结论

Protobuf 里没有传统意义上的大端/小端,它用的是自己的 varint 变长编码
但你问的“大端小端”是计算机底层字节序,必须先搞懂,才能理解为什么 Protobuf 要这么设计。

2. 什么是大端、小端?(超通俗)

一个数字比如 0x1234(十进制 4660),占 2 个字节

  • 高字节:0x12
  • 低字节:0x34

内存里怎么存这两个字节,就分大端小端

大端(Big-Endian)

高字节放前面,低字节放后面
像我们正常写字:从左到右,高位在前。
0x1234 → 内存:12 34

小端(Little-Endian)

低字节放前面,高字节放后面
反过来存。
0x1234 → 内存:34 12


3. 区别是什么?

  • 大端:人类阅读顺序,网络协议(TCP/IP)默认用它
  • 小端:x86/AMD64 电脑 CPU 原生用它,计算更快

关键:同一段二进制,大小端解析出来是完全不同的数字!

  • 大端 12 34 → 0x1234 = 4660
  • 小端 34 12 → 0x3412 = 13330

差非常大!所以网络传输必须统一字节序


4. 回到 Protobuf:它用的是什么?

Protobuf 根本不使用固定长度的大端/小端,而是:

varint 变长编码(小端序的变种)

特点:

  • 数字越小,占用字节越少
  • 每个字节最高位表示是否还有后续字节
  • 字节内部是小端排列(低字节先传)

举例:数字 300
二进制:100101100(9位)
Protobuf varint 编码成:
10101100 00000010 → 两个字节

它是小端思想:低位组先传,高位组后传。


5. 你最关心的:Protobuf 里的「长度」

Protobuf 消息结构:

[键值对1][键值对2][键值对3]...

每个键值对:

(字段号+类型) varint | 数据长度 varint | 数据

这里的长度就是:

  • varint 编码
  • 内部是 小端序排列
  • 不是传统大端,也不是固定4字节长度

6. 极简总结(背这个就够)

  1. 大端:高位字节在前(网络标准、人类习惯)
  2. 小端:低位字节在前(CPU 常用)
  3. Protobuf:不用传统大小端,用 varint 变长编码,字节组是小端序
  4. 区别:字节顺序不同,解析出的数字完全不同,网络传输必须统一

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐