快速了解 “小字端” 和 “大字端” 及 Go 語言中的使用
“大字端” 和 “小字端” 表示的是數據存儲時的順序區別,例如:
對于數字 573785173 用十六進制表示為 0x22334455 。如何轉化的,本篇不需要搞清楚,但如果你不懂就最好了解下。
對于 0x22334455 ,左邊是高位,右邊是低位,這和我們平常表示數字是一樣的,例如:十二(12),1 就是高位(十位),2 就是低位(個位)。
那么給這種,從左到右,由高位到低位的表示方法就稱為 “大字端”。
相反,從左到右,由低位到高位的表示方法就稱為 “小字端”。
在計算機存儲數據時,是以字節為單位去存儲,因此把 0x22334455 拆分:
- 大字端:0x22 0x33 0x44 0x55
- 小字端:0x55 0x44 0x33 0x22
為啥出現兩種
因為不同的使用場景下,效率是不一樣。
大字端
例如,對于網絡傳輸,使用的就是大字端。為什么?
因為,早年設備的緩存很小,先接收高字節能快速的判斷報文信息:包長度(需要準備多大緩存)、地址范圍(IP地址是從前到后匹配的)。
在性能不是很好的設備上,高字節在先確實是會更快一些。
小字端
例如,對于一個加法器,選擇的是小字端。為什么?
因為,加法是從低位到高位開始加,一旦有進位,就直接送到下一位,設計就很簡單。
Go 語言中應用
使用 Go 語言中 binary 這個標準包,該包實現了數字與字節之間的轉化。
下來我們將數字 0x22334455 轉化為大字端字節存儲。
- buffer := new(bytes.Buffer)
- binary.Write(buffer, binary.BigEndian, int32(0x22334455))
- binary.BigEndian 常量,表示大字端。
將數字 0x22334455 轉化為小字端字節存儲。
- buffer := new(bytes.Buffer)
- binary.Write(buffer, binary.LittleEndian, int32(0x22334455))
- binary.LittleEndian 常量,表示小字端。
完整例子(僅展示大字端):
- package main
- import (
- "bytes"
- "encoding/binary"
- "fmt"
- )
- func main() {
- buffer := new(bytes.Buffer)
- err := binary.Write(buffer, binary.BigEndian, int32(0x22334455))
- if err != nil {
- panic(err)
- }
- var num int32
- err = binary.Read(buffer,binary.BigEndian, &num)
- if err != nil {
- panic(err)
- }
- fmt.Println(num)
- }
- binary.Write 寫入 buffer 變量。
- binary.Read 從 buffer 變量讀取。
- int32(0x22334455) 必須使用固定長度,比如 int 類型就不可以,支持類型如下圖:
再補充一個類型 []byte,它等價于 []uint8 類型。
參考
官方:https://pkg.go.dev/encoding/binary
本文轉載自微信公眾號「 瀟灑哥和黑大帥」,可以通過以下二維碼關注。轉載本文請聯系 瀟灑哥和黑大帥公眾號。