go语言大端模式和小端模式

 阅读大约需要1分钟

go语言大端模式和小端模式

什么是大端和小端?

Big-Endian和Little-Endian的定义如下:

  1. Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

  2. 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内部存储数据,而在其他场景例如网络传输和文件存储使用大端序。

在网络协议层操作二进制数字时约定使用大端序,大端序是网络字节传输采用的方式。