社区编辑申请
注册/登录
快速了解 “小字端” 和 “大字端” 及 Go 语言中的使用
开发 后端
对于数字 573785173 用十六进制表示为 0x22334455 。如何转化的,本篇不需要搞清楚,但如果你不懂就最好了解下。

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

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

对于 0x22334455 ,左边是高位,右边是低位,这和我们平常表示数字是一样的,例如:十二(12),1 就是高位(十位),2 就是低位(个位)。

那么给这种,从左到右,由高位到低位的表示方法就称为 “大字端”。

相反,从左到右,由低位到高位的表示方法就称为 “小字端”。

在计算机存储数据时,是以字节为单位去存储,因此把 0x22334455 拆分:

  • 大字端:0x22 0x33 0x44 0x55
  • 小字端:0x55 0x44 0x33 0x22

为啥出现两种

因为不同的使用场景下,效率是不一样。

大字端

例如,对于网络传输,使用的就是大字端。为什么?

因为,早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地址范围(IP地址是从前到后匹配的)。

在性能不是很好的设备上,高字节在先确实是会更快一些。

小字端

例如,对于一个加法器,选择的是小字端。为什么?

因为,加法是从低位到高位开始加,一旦有进位,就直接送到下一位,设计就很简单。

Go 语言中应用

使用 Go 语言中 binary 这个标准包,该包实现了数字与字节之间的转化。

下来我们将数字 0x22334455 转化为大字端字节存储。

  1. buffer := new(bytes.Buffer) 
  2. binary.Write(buffer, binary.BigEndian, int32(0x22334455)) 
  • binary.BigEndian 常量,表示大字端。

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

  1. buffer := new(bytes.Buffer) 
  2. binary.Write(buffer, binary.LittleEndian, int32(0x22334455)) 
  • binary.LittleEndian 常量,表示小字端。

完整例子(仅展示大字端):

  1. package main 
  2.  
  3. import ( 
  4.    "bytes" 
  5.    "encoding/binary" 
  6.    "fmt" 
  7.  
  8. func main() { 
  9.    buffer := new(bytes.Buffer) 
  10.    err := binary.Write(buffer, binary.BigEndian, int32(0x22334455)) 
  11.    if err != nil { 
  12.       panic(err) 
  13.    } 
  14.  
  15.    var num int32 
  16.    err = binary.Read(buffer,binary.BigEndian, &num) 
  17.    if err != nil { 
  18.       panic(err) 
  19.    } 
  20.  
  21.    fmt.Println(num) 
  22.  
  • binary.Write 写入 buffer 变量。
  • binary.Read 从 buffer 变量读取。
  • int32(0x22334455) 必须使用固定长度,比如 int 类型就不可以,支持类型如下图:

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

参考

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

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

 

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

2022-04-11 11:38:44

Python代码游戏

2022-05-03 22:25:57

Python浏览器语言

2022-05-16 10:36:08

GitHub开源项目

2022-04-21 10:01:48

VMware

2022-05-10 16:04:40

编程语言PythonC语言

2022-05-16 10:49:28

网络协议数据

2022-04-07 15:28:16

HarmonyOS鸿蒙操作系统

2022-05-17 16:56:33

开发工具前端

2022-05-06 16:31:27

人工智能自然语言生物特征识别

2022-04-18 09:41:14

Go架构设计

2022-04-13 09:57:24

Go语言C语言程序开发

2022-05-20 08:55:02

py文件exepython

2022-04-13 08:20:32

DockerGo项目

2022-03-25 21:57:49

2022-05-18 08:05:31

2022-04-29 09:10:25

MobaXterm软件Linux

2022-05-20 16:43:08

加密货币虚拟货币比特币

2022-05-09 07:08:14

LinuxBashShell

2022-04-26 05:49:45

物联网OTIT

2022-05-03 23:44:21

Python动态链接库Ctypes

同话题下的热门内容

Python 字符串总结,建议收藏!这份Java日志格式规范,拿走不谢!Mybatis-Plus官方发布分库分表神器,一个依赖轻松搞定!后端思维篇:如何应用设计模式优化代码改变 Python 对象规则的黑魔法 Metaclass几种限流算法的Go语言实现JMeter关联之正则表达式提取器在 Go 中实现一个支持并发的 TCP 服务端

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号