笔记

Golang 大端序与小端序

字节与位

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
 */


0 条评论

发表评论:

电子邮件地址不会被公开。 必填项已用*标注

相关推荐