字节序按类别分两种,一种是小端(Little Endian),另一种是大端(Big Endian)。 (1)小端字节序,指一个单元在计算机中存放时按照低位在低地址,高位在高地址的模式存放; (2)大端字节序,指一个单元在计算机中存放时按照低位在高地址,高位在低地址的模式存放。
字节序按应用场景也分两种,一是网络字节序,二是主机字节序。网络字节序为大端字节序,是确定的。主机字节序由 CPU 架构确定,可能是小端,也可能是大端,一般使用的 Intel 与 AMD 的 CPU 均为小端字节序。
下面以 Golang 为例,实现主机字节序的判断。
import "unsafe"
func IsLittleEndian() bool {
n := 0x1234
f := *((*byte)(unsafe.Pointer(&n)))
return (f ^ 0x34) == 0
}
注意,Golang 是强类型语言,不允许不同类型的指针之间进行强制转化,因此需要借助 unsafe.Pointer 进行一次中转。