本文最后由 森林生灵 于 2021/05/14 10:55:32 编辑
字节与位
1 字节 (byte) = 8 位 (bit)
byte 范围与 ASCII 表一致
十进制 | 十六进制 | 二进制 |
---|---|---|
0 ~ 255 | 0x00 ~ 0xFF | 0000 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 大端序与小端序
版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
相关文章
上一篇:RUST 入坑笔记