Go 将uint8的类型转换为unit32


原文链接: Go 将uint8的类型转换为unit32

【大端模式】 CPU对操作数的存放方式是 低地址存放高位,高地址存放低位。 0x 12 34 56 78

【小端模式】CPU对操作数的存放方式是 低地址存放低位。 高地址存放高位。

/**
 * Fast little endian check
 * NOTE: not applicable for PDP endian
 */
static inline bool is_little_endian(void)
{
    static uint16_t x = 0x01;
    return *((uint8_t *) &x);
}

golang语言如何判断机器的大小端?

package main   
  
import (   
    "fmt"  
    "unsafe"  
)   
  
const N int = int(unsafe.Sizeof(0))   
  
func main() {   
    x := 0x0001   
    p := unsafe.Pointer(&x)   
    p2 := (*[N]byte)(p)    
    if p2[0] == 0x01 {    //低地址存放低位
        fmt.Println("本机器:小端")   
    } else {   
        fmt.Println("本机器:大端")   
    }   
}  

大小端编码

package main

import (
    "encoding/binary"
    "fmt"
)

func main() {
    u8 := []uint8{0, 1, 2, 3}
    u32LE := binary.LittleEndian.Uint32(u8)
    fmt.Println("little-endian:", u8, "to", u32LE)
    u32BE := binary.BigEndian.Uint32(u8)
    fmt.Println("big-endian:   ", u8, "to", u32BE)
}

输出:

little-endian: [0 1 2 3] to 50462976 0x03020100
big-endian: [0 1 2 3] to 66051 0x01020304

Go 二进制包函数被实现为一系列的转换。

func (littleEndian) Uint32(b []byte) uint32 {
    return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
}

func (bigEndian) Uint32(b []byte) uint32 {
    return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
}
`