此篇介绍一下字节序的概念。

字节序

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。

小端(Little-endian,小头)

低位字节 存储在起始地址(低地址)。

大端(Big-endian,大头)

高位字节 存储在起始地址(低地址)。

即看低地址存储什么样的字节。

举例

  1. Intel系列通常是小头字节序,Arm体系通常是大头序列。
  2. Java平台二进制读写一律采用大头字节序,网络上数据传输也都采用大头字节序。
  3. C++不跨平台,所以它的大小头依赖于系统架构。
  4. 网络上通常采用 大头字节序 ,所以大头字节序又叫 网络字节序
  5. intel占据大量PC,都采用 小头字节序 ,所以小头字节序又叫 主机字节序
  6. 字节序按应用场景也分两种,一是网络字节序,二是主机字节序。网络字节序为大端字节序,是确定的。主机字节序由 CPU 架构确定,可能是小端,也可能是大端,一般使用的 Intel 与 AMD 的 CPU 均为小端字节序。

Go判断大小端

package main

import (
	"fmt"
	"unsafe"
)

func IsLittleEndian() bool {
	n := 0x1234
	f := *((*byte)(unsafe.Pointer(&n)))

	return (f ^ 0x34) == 0
}
func main() {
	fmt.Println(IsLittleEndian())
}

注:Golang 是强类型语言,不允许不同类型的指针之间进行强制转化,因此需要借助 unsafe.Pointer 进行一次中转。