解释一下Golang中的大端序和小端序?

在计算机科学中,字节序是指存储多字节数据类型(如int16int32int64等)时,字节的排列顺序。字节序分为两种:大端序(Big-Endian)和小端序(Little-Endian)。

大端序(Big-Endian):最高有效字节(Most Significant Byte,MSB)存储在最低的内存地址,最低有效字节(Least Significant Byte,LSB)存储在最高的内存地址。也就是说,大的端(高位字节)在前。

小端序(Little-Endian):最低有效字节(LSB)存储在最低的内存地址,最高有效字节(MSB)存储在最高的内存地址。也就是说,小的端(低位字节)在前。

例如,假设我们有一个int16类型的数字0x0102,在内存中的表示如下:

  • 在大端序中,它会被存储为01 0201处于较低的内存地址)。
  • 在小端序中,它会被存储为02 0102处于较低的内存地址)。

在Golang中,encoding/binary包提供了读取和写入数据的大端序和小端序的函数。以下是一个例子:

package main

import (
    "encoding/binary"
    "bytes"
    "fmt"
)

func main() {
    // 创建一个 bytes.Buffer,我们可以在这里写入二进制数据
    buf := new(bytes.Buffer)

    // 写入一个大端序的uint32值
    binary.Write(buf, binary.BigEndian, uint32(123456))

    // 读取一个大端序的uint32值
    var num uint32
    binary.Read(buf, binary.BigEndian, &num)

    fmt.Println(num) // 输出123456
}

同样,如果你想使用小端序,只需要将binary.BigEndian替换为binary.LittleEndian即可。

发表评论

后才能评论