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
}