Golang 大端序与小端序

本文最后由 森林生灵 于 2021/05/14 10:55:32 编辑

文章目录 (?) [+]

    字节与位

    1 字节 (byte) = 8 位 (bit)

    byte 范围与 ASCII 表一致


    十进制十六进制二进制
    0 ~ 2550x00 ~ 0xFF0000 0000 ~ 1111 1111


    字节序

    大端序 (Big Endian),低地址端存放高位字节(高位低址),应用于网络字节传输

    小端序 (Little Endian),低地址端存放低位字节,应用于 CPU 内部存储数据。

    举例

     // 高位数<- ->低位数
     var a int32 = 0x12345678
     
     // 大端序
     // 低地址<-    ->高地址
     [0x12 0x34 0x56 0x78]
     
     // 小端序
     // 低地址<-    ->高地址
     [0x78 0x56 0x34 0x12]

    实际应用

     package main
     
     import (
      "encoding/binary"
      "fmt"
      "unsafe"
     )
     
     const INT_SIZE int = int(unsafe.Sizeof(0))
     
     //               高位数<-                           ->低位数
     // BIN           0000 0000 0000 0000   0000 0001 0000 0000
     // HEX                0x00      0x00        0x01      0x00
     
     //               低地址<-                           ->高地址
     // bytes          bytes[0]  bytes[1]    bytes[2]  bytes[3]
     // BigEndian       [  0x00      0x00        0x01      0x00  ]
     // LittleEndian    [  0x00      0x01        0x00      0x00  ]
     
     var testInt int32 = 256
     
     // 判断系统的字节序类型
     func systemEndian() {
      var i int = 0x1
      bs := (*[INT_SIZE]byte)(unsafe.Pointer(&i))
      if bs[0] == 0 {
       fmt.Println("system endian is little endian")
      } else {
       fmt.Println("system endian is big endian")
      }
     }
     
     // 大端序
     func testBigEndian() {
      var testBytes []byte = make([]byte, 4)
      binary.BigEndian.PutUint32(testBytes, uint32(testInt))
      fmt.Println("int32 to big endian bytes:", testBytes)
     
      convInt := binary.BigEndian.Uint32(testBytes)
      fmt.Printf("big endian bytes to int32: %d\n", convInt)
     }
     
     // 小端序
     func testLittleEndian() {
      var testBytes []byte = make([]byte, 4)
      binary.LittleEndian.PutUint32(testBytes, uint32(testInt))
      fmt.Println("int32 to little endian bytes:", testBytes)
     
      convInt := binary.LittleEndian.Uint32(testBytes)
      fmt.Printf("little endian bytes to int32: %d\n", convInt)
     }
     
     func main() {
      systemEndian()
      testBigEndian()
      testLittleEndian()
     }
     
     /*
     system endian is big endian
     int32 to big endian bytes: [0 0 1 0]
     big endian bytes to int32: 256
     int32 to little endian bytes: [0 1 0 0]
     little endian bytes to int32: 256
     */


    本文标题:Golang 大端序与小端序
    本文链接:https://www.lanseyujie.com/post/golang-big-endian-and-little-endian.html
    版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
    点赞 0 分享 0