弄清字節(jié)序

BigEndian、LittleEndian 字節(jié)在內(nèi)存地址中的存放順序,簡稱字節(jié)序。

弄清概念

網(wǎng)絡(luò)上常把把 Endian 譯成端,簡稱大端、小端,很容易產(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)用場合

一般來說,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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容