【Netty】【Protobuf】-----Protobuf里的长度。里面大端小端是什么意思。有什么区别
一个数字比如0x1234(十进制 4660),占2 个字节0x120x34内存里怎么存这两个字节,就分大端和小端大端:高位字节在前(网络标准、人类习惯)小端:低位字节在前(CPU 常用)Protobuf:不用传统大小端,用varint 变长编码,字节组是小端序区别:字节顺序不同,解析出的数字完全不同,网络传输必须统一。
·
我用最直白、不绕弯的方式给你讲清楚 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. 极简总结(背这个就够)
- 大端:高位字节在前(网络标准、人类习惯)
- 小端:低位字节在前(CPU 常用)
- Protobuf:不用传统大小端,用 varint 变长编码,字节组是小端序
- 区别:字节顺序不同,解析出的数字完全不同,网络传输必须统一
更多推荐
所有评论(0)