快速了解 “小字端” 和 “大字端” 及 Go 语言中的使用

开发 后端
对于数字 573785173 用十六进制表示为 0x22334455 。如何转化的,本篇不需要搞清楚,但如果你不懂就最好了解下。

[[443198]]

 “大字端” 和 “小字端” 表示的是数据存储时的顺序区别,例如:

对于数字 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)) 
  • 1.
  • 2.
  • binary.BigEndian 常量,表示大字端。

将数字 0x22334455 转化为小字端字节存储。

buffer := new(bytes.Buffer) 
binary.Write(buffer, binary.LittleEndian, int32(0x22334455)) 
  • 1.
  • 2.
  • 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) 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • binary.Write 写入 buffer 变量。
  • binary.Read 从 buffer 变量读取。
  • int32(0x22334455) 必须使用固定长度,比如 int 类型就不可以,支持类型如下图:

再补充一个类型 []byte,它等价于 []uint8 类型。

参考

官方:https://pkg.go.dev/encoding/binary

本文转载自微信公众号「 潇洒哥和黑大帅」,可以通过以下二维码关注。转载本文请联系 潇洒哥和黑大帅公众号。

 

责任编辑:武晓燕 来源: 潇洒哥和黑大帅
相关推荐

2025-03-20 07:01:40

2025-03-28 07:50:00

端到端测试Go语言

2023-10-09 07:14:42

panicGo语言

2024-05-10 08:36:40

Go语言对象

2023-12-30 18:35:37

Go识别应用程序

2023-11-21 15:46:13

Go内存泄漏

2012-06-15 09:56:40

2024-04-01 00:02:56

Go语言代码

2021-05-07 15:28:03

Kafka客户端Sarama

2014-04-09 09:32:24

Go并发

2021-09-22 15:46:29

虚拟桌面瘦客户端胖客户端

2023-12-21 07:09:32

Go语言任务

2021-07-15 23:18:48

Go语言并发

2024-04-07 11:33:02

Go逃逸分析

2013-06-25 09:52:32

GoGo语言Go编程

2024-11-05 18:18:48

2016-11-14 17:36:57

Angular 2应用程序端对端

2023-11-30 08:09:02

Go语言

2023-07-29 15:03:29

2022-07-19 12:25:29

Go
点赞
收藏

51CTO技术栈公众号