解释一下Golang中的大端序和小端序?
在计算机科学中,字节序是指存储多字节数据类型(如int16
、int32
、int64
等)时,字节的排列顺序。字节序分为两种:大端序(Big-Endian)和小端序(Little-Endian)。
大端序(Big-Endian):最高有效字节(Most Significant Byte,MSB)存储在最低的内存地址,最低有效字节(Least Significant Byte,LSB)存储在最高的内存地址。也就是说,大的端(高位字节)在前。
小端序(Little-Endian):最低有效字节(LSB)存储在最低的内存地址,最高有效字节(MSB)存储在最高的内存地址。也就是说,小的端(低位字节)在前。
例如,假设我们有一个int16
类型的数字0x0102
,在内存中的表示如下:
- 在大端序中,它会被存储为
01 02
(01
处于较低的内存地址)。 - 在小端序中,它会被存储为
02 01
(02
处于较低的内存地址)。
在Golang中,encoding/binary
包提供了读取和写入数据的大端序和小端序的函数。以下是一个例子:
package main
import (
"encoding/binary"
"bytes"
"fmt"
)
func main() {
// 创建一个 bytes.Buffer,我们可以在这里写入二进制数据
buf := new(bytes.Buffer)
// 写入一个大端序的uint32值
binary.Write(buf, binary.BigEndian, uint32(123456))
// 读取一个大端序的uint32值
var num uint32
binary.Read(buf, binary.BigEndian, &num)
fmt.Println(num) // 输出123456
}
同样,如果你想使用小端序,只需要将binary.BigEndian
替换为binary.LittleEndian
即可。