对于数字 573785173 用十六进制表示为 0x22334455 . 如何转化的, 本篇不需要搞清楚, 但如果你不懂就最好了解下.
"大字端" 和 "小字端" 表示的是数据存储时的顺序区别, 例如:
对于数字 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
本文转载自微信公众号「 潇洒哥和黑大帅」, 可以通过以下二维码关注. 转载本文请联系 潇洒哥和黑大帅公众号.
来源: http://developer.51cto.com/art/202112/697505.htm