encoding/binary
回想区
- 为什么除了encoding/json,我们还需要encoding/binary?文本协议和二进制协议区别是什么?
- 什么是字节序?能否举一个例子说明字节序不同带来的变化?
- 为什么要引入小端法?优点是什么?
- 什么是网络字节序?
- 如何从字节切片中读取一个定长整数?
- 如何将一个定长整数写入到字节切片中?
- 如何从比特流中读取一个定长整数?
- 如何从比特流中写入一个定长整数?
- 什么是不定长编码?
encoding/binary
使用的不定长编码协议是怎么样的? - 如何从字节切片读取一个不定长整数?
- 如何将一个整数按照不定长编码的形式写入到字节切片中?
- 如何从比特流中读取一个不定长整数?
-
什么时候我们需要encoding/binary?
-
什么是二进制协议?与文本协议区别在哪里?
文本协议为了能够可读,约束了适用字符在ASCII或者unicode。
比方说数字26,在文本协议下需要用两个字节分别表示”2“和”6“,而在二进制协议下只需要使用一个字节——*0x1A。*因此二进制协议节省了内存, 除此之外,二进制协议可以被计算机直接理解。
-
什么是字节序?
字节序是指二进制数据在内存中的存储顺序。以数字”287454020“为例,在十六进制表示下为0x11223344。最高字节是0x11,最低字节是0x44。
如果我们在存储的时候,按照
11 22 33 44
来存储,那么就是大端法。而如果按照44 33 22 11
来存储,那么就是小端法。 -
为什么会使用小端法?
可能很多人奇怪,为什么会有小端法这种看起来比较别扭的形式呢?事实上,很多CPU都使用小端法,其原因在于使用小端法可以让我们在不移动字节的前提下改变数字类型大小。
比方说对于
0x11223344
,现在占用了四个字节(int32),如果我们希望转换为8个字节(int64)。在大端法下为00 00 00 00 11 22 33 44
,我们需要迁移四个字节;而小端法下为44 33 22 11 00 00 00 00
,我们不需要迁移。 -
什么是网络字节序?
遗憾的是,虽然计算机系统常常使用小端法。但是网络传输约定了使用大端法,因此大端法常常也称之为网络字节序。
之所以需要提及该点,是因为我们需要记住在传输之前进行必要的字节序转换。
定长编码
定长编码也就是对int8,int16.,int32,int64等有着固定长度的数字类型编码
encoding包中常常会区分”处理比特流“和“处理字节切片”
编码至字节切片
type ByteOrder interface {
Uint16([]