快速了解 “小字端” 和 “大字端” 及 Go 語言中的使用
“大字端” 和 “小字端” 表示的是數(shù)據(jù)存儲時的順序區(qū)別,例如:
對于數(shù)字 573785173 用十六進(jìn)制表示為 0x22334455 。如何轉(zhuǎn)化的,本篇不需要搞清楚,但如果你不懂就最好了解下。
對于 0x22334455 ,左邊是高位,右邊是低位,這和我們平常表示數(shù)字是一樣的,例如:十二(12),1 就是高位(十位),2 就是低位(個位)。
那么給這種,從左到右,由高位到低位的表示方法就稱為 “大字端”。
相反,從左到右,由低位到高位的表示方法就稱為 “小字端”。
在計算機(jī)存儲數(shù)據(jù)時,是以字節(jié)為單位去存儲,因此把 0x22334455 拆分:
- 大字端:0x22 0x33 0x44 0x55
- 小字端:0x55 0x44 0x33 0x22
為啥出現(xiàn)兩種
因為不同的使用場景下,效率是不一樣。
大字端
例如,對于網(wǎng)絡(luò)傳輸,使用的就是大字端。為什么?
因為,早年設(shè)備的緩存很小,先接收高字節(jié)能快速的判斷報文信息:包長度(需要準(zhǔn)備多大緩存)、地址范圍(IP地址是從前到后匹配的)。
在性能不是很好的設(shè)備上,高字節(jié)在先確實是會更快一些。
小字端
例如,對于一個加法器,選擇的是小字端。為什么?
因為,加法是從低位到高位開始加,一旦有進(jìn)位,就直接送到下一位,設(shè)計就很簡單。
Go 語言中應(yīng)用
使用 Go 語言中 binary 這個標(biāo)準(zhǔn)包,該包實現(xiàn)了數(shù)字與字節(jié)之間的轉(zhuǎn)化。
下來我們將數(shù)字 0x22334455 轉(zhuǎn)化為大字端字節(jié)存儲。
- buffer := new(bytes.Buffer)
- binary.Write(buffer, binary.BigEndian, int32(0x22334455))
- binary.BigEndian 常量,表示大字端。
將數(shù)字 0x22334455 轉(zhuǎn)化為小字端字節(jié)存儲。
- 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
本文轉(zhuǎn)載自微信公眾號「 瀟灑哥和黑大帥」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 瀟灑哥和黑大帥公眾號。