当前位置: 首页 > 科技观察

快速理解“小端”和“大端”以及Go语言的用法

时间:2023-03-16 15:03:04 科技观察

“大端”和“小端”表示数据存储顺序的区别,例如:对于数字573785173用十六进制表示是0x22334455。怎么改造,这篇文章不用去琢磨,但是如果不懂,最好懂。对于0x22334455,左边是高位,右边是低位,和我们平时表示数字是一样的,比如:十二(12),1是高位(十位),2是低位(个)。那么,这种表示法,从左到右,从高到低,就叫做“大端”。反之,从左到右,从低到高的表示方式称为“littleendian”。计算机存储数据时,是以字节为单位存储的,所以拆分0x22334455:Large-endian:0x220x330x440x55Small-endian:0x550x440x330x22为什么会有两种呢?因为在不同的使用场景下效率是不一样的。Big-endian例如,对于网络传输,使用big-endian。为什么?因为早年设备的缓存很小,先接收高字节可以快速判断报文信息:包长(需要准备多少缓存),地址范围(IP地址从前到后匹配).在性能较差的设备上,大字节优先确实更快。LittleEndian例如,对于加法器,选择的是littleendian。为什么?因为加法是从低位开始往高位开始的。一旦有进位,直接送入下一位。设计非常简单。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常量,表示小端。完整示例(仅显示大端):packagemainimport("bytes""encoding/binary""fmt")funcmain(){buffer:=new(bytes.Buffer)err:=binary.Write(buffer,binary.BigEndian,int32(0x22334455))iferr!=nil{panic(err)}varnumint32err=binary.Read(buffer,binary.BigEndian,&num)iferr!=nil{panic(err)}fmt.Println(num)}binary.Write写入缓冲区多变的。binary.Read从缓冲区变量中读取。int32(0x22334455)必须使用固定长度。例如,不能使用int类型。支持的类型如下图所示:增加一个类型[]byte,相当于[]uint8类型。参考官网??:https://pkg.go.dev/encoding/binary本文转载自微信公众号“小洒哥与黑大帅”,可通过以下二维码关注。转载本文请联系小撒哥和黑元帅公众号。