go语言大端模式和小端模式
什么是大端和小端?
Big-Endian和Little-Endian的定义如下:
Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
例如十进制258,十六进制值为0x0102在内存中的表示形式为:
1)大端模式:
低地址 —————–> 高地址
0x01 | 0x02
2)小端模式:
低地址 ——————> 高地址
0x02 | 0x01
go语言代码如下:
package main
import (
"encoding/binary"
"fmt"
)
func BigEndian() {
// 大端序
var testInt int32 = 0x0102
fmt.Printf("%d use big endian: \n", testInt)
var testBytes = make([]byte, 4)
binary.BigEndian.PutUint32(testBytes, uint32(testInt))
fmt.Println("int32 to bytes:", testBytes)
convInt := binary.BigEndian.Uint32(testBytes)
fmt.Printf("bytes to int32: %d\n\n", convInt)
}
func LittleEndian() {
// 小端序
var testInt int32 = 0x0102
fmt.Printf("%d use little endian: \n", testInt)
var testBytes = make([]byte, 4)
binary.LittleEndian.PutUint32(testBytes, uint32(testInt))
fmt.Println("int32 to bytes:", testBytes)
convInt := binary.LittleEndian.Uint32(testBytes)
fmt.Printf("bytes to int32: %d\n\n", convInt)
}
func main() {
BigEndian()
LittleEndian()
}
运行结果如下:
258 use big endian:
int32 to bytes: [0 0 1 2]
bytes to int32: 258
258 use little endian:
int32 to bytes: [2 1 0 0]
bytes to int32: 258
正如定义的一样,大端模式高位字节(0x00,0x00)排放在内存的低地址端(b[0],b[1]),低位字节(0x01,0x02)排放在内存的高地址端(b[2],b[3])。
小端模式高位字节(0x00,0x00)排放在内存的高地址端(b[2],b[3]),低位字节(0x02,0x01)排放在内存的低地址端(b[0],b[1])。
在计算机内部,小端序被广泛应用于现代性CPU内部存储数据,而在其他场景例如网络传输和文件存储使用大端序。
在网络协议层操作二进制数字时约定使用大端序,大端序是网络字节传输采用的方式。