弄清字节序

BigEndian、LittleEndian 字节在内存地址中的存放顺序,简称字节序。

弄清概念

网络上常把把 Endian 译成端,简称大端、小端,很容易产生歧义,端指的是开头还是结尾。

endian - 组成 end-ianend 结束的意思,-ian表示"……地方人,信仰…….教的人,从事……职业的人",所以就是结束的地方,及末端、结尾处。

如uint32值1,存储在内存中

大端字节序:00 00 00 01 (视觉上结尾大)
小端字节序:01 00 00 00 (视觉上结尾小)

内存地址:低地址(开头) -> 高地址(结尾)
  • BigEndian:大(尾)端 - 值从结尾处放,结尾先有值,开头为 0,所以叫大尾端
  • LittleEndian:小(尾)端 - 值从开头处先放,开头先有值,结尾为 0,所以叫小尾端
Capture.PNG

应用场合

一般来说,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

你可能感兴趣的:(弄清字节序)