BigEndian、LittleEndian 字节在内存地址中的存放顺序,简称字节序。
弄清概念
网络上常把把 Endian 译成端,简称大端、小端,很容易产生歧义,端指的是开头还是结尾。
endian
- 组成 end-ian
,end
结束的意思,-ian
表示"……地方人,信仰…….教的人,从事……职业的人",所以就是结束的地方,及末端、结尾处。
如uint32值1,存储在内存中
大端字节序:00 00 00 01 (视觉上结尾大)
小端字节序:01 00 00 00 (视觉上结尾小)
内存地址:低地址(开头) -> 高地址(结尾)
- BigEndian:大(尾)端 - 值从结尾处放,结尾先有值,开头为 0,所以叫大尾端
- LittleEndian:小(尾)端 - 值从开头处先放,开头先有值,结尾为 0,所以叫小尾端
应用场合
一般来说,x86 系列 CPU 都是 little-endian 的字节序,PowerPC 通常是 big-endian,网络字节顺序也是 big-endian 还有的 CPU 能通过跳线来设置 CPU 工作于 Little endian 还是 Big endian 模式。
代码实例
package main
import (
"encoding/binary"
"fmt"
)
func main() {
var a uint32 = 257
b := make([]byte, 4)
binary.BigEndian.PutUint32(b, a)
fmt.Println(b)
for i := range b {
fmt.Printf("%p\n", &b[i])
}
fmt.Println("")
c := make([]byte, 4)
binary.LittleEndian.PutUint32(c, a)
fmt.Println(c)
for i := range c {
fmt.Printf("%p\n", &c[i])
}
}
BigEndian: [0 0 1 1]
0xc0000b8010
0xc0000b8011
0xc0000b8012
0xc0000b8013
LittleEndian: [1 1 0 0]
0xc0000b8014
0xc0000b8015
0xc0000b8016
0xc0000b8017