BigEndian需纳、LittleEndian 字節(jié)在內(nèi)存地址中的存放順序,簡(jiǎn)稱字節(jié)序艺挪。
弄清概念
網(wǎng)絡(luò)上常把把 Endian 譯成端不翩,簡(jiǎn)稱大端、小端麻裳,很容易產(chǎn)生歧義口蝠,端指的是開頭還是結(jié)尾。
endian
- 組成 end-ian
津坑,end
結(jié)束的意思妙蔗,-ian
表示"……地方人,信仰…….教的人疆瑰,從事……職業(yè)的人"眉反,所以就是結(jié)束的地方,及末端穆役、結(jié)尾處寸五。
如uint32值1,存儲(chǔ)在內(nèi)存中
大端字節(jié)序:00 00 00 01 (視覺上結(jié)尾大)
小端字節(jié)序:01 00 00 00 (視覺上結(jié)尾泄⒈摇)
內(nèi)存地址:低地址(開頭) -> 高地址(結(jié)尾)
- BigEndian:大(尾)端 - 值從結(jié)尾處放梳杏,結(jié)尾先有值,開頭為 0掰读,所以叫大尾端
- LittleEndian:小(尾)端 - 值從開頭處先放,開頭先有值叭莫,結(jié)尾為 0蹈集,所以叫小尾端
Capture.PNG
應(yīng)用場(chǎng)合
一般來說,x86 系列 CPU 都是 little-endian 的字節(jié)序雇初,PowerPC 通常是 big-endian拢肆,網(wǎng)絡(luò)字節(jié)順序也是 big-endian 還有的 CPU 能通過跳線來設(shè)置 CPU 工作于 Little endian 還是 Big endian 模式。
代碼實(shí)例
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