当前位置: 首页 > news >正文

binary.write 和 binary.read

golang中encoding/binary包

1、golang包中的binary包是什么?
2、binary为我们开发者提供了哪些内容?以及怎么使用?
3、编解码有哪几种方法?

转化成二进制格式与原本数据转字符串相比会更节省空间

一、golang包中的binary包是什么?
此包实现了对数据与byte之间的转换,以及varint的编解码。

二、binary为我们开发者提供了哪些内容?以及怎么使用?
数据的byte序列化转换

func Read(r io.Reader, order ByteOrder, data interface{}) error
func Write(w io.Writer, order ByteOrder, data interface{}) error
func Size(v interface{}) int

uvarint和varint的编解码

func PutUvalint(buf []byte, x uint64) int
func PutVarint(buf []byte, x int64) int
func Uvarint(buf []byte) (uint64, int)
func Varint(buf []byte) (int64, int)
func ReadUvarint(r io.ByteReader) (uint64, error)
func ReadVarint(r io.ByteReader) (int64, error)

结构体

type ByteOrder:可以定义自己的字节序结构,用于序列化和反序列化数据。

1)func Read(r io.Reader, order ByteOrder, data interface{}) error

参数列表:
1)r  可以读出字节流的数据源
2)order  特殊字节序,包中提供大端字节序和小端字节序
3)data  需要解码成的数据
返回值:error  返回错误
功能说明:Read从r中读出字节数据并反序列化成结构数据。data必须是固定长的数据值或固定长数据的slice。从r中读出的数据可以使用特殊的 字节序来解码,并顺序写入value的字段。当填充结构体时,使用(_)名的字段讲被跳过。

代码案例

package mainimport ("fmt""log""bytes""encoding/binary"
)func main() {var pi float64b := []byte{0x18,0x2d,0x44,0x54,0xfb,0x21,0x09,0x40}buf := bytes.NewBuffer(b)err := binary.Read(buf, binary.LittleEndian, &pi)if err != nil {log.Fatalln("binary.Read failed:", err)}fmt.Println(pi)
}

2)Write(w io.Writer, order ByteOrder, data interface{}) error

参数列表:
1)w  可写入字节流的数据
2)order  特殊字节序,包中提供大端字节序和小端字节序
3)data  需要解码的数据
返回值:error  返回错误
功能说明:
Write讲data序列化成字节流写入w中。data必须是固定长度的数据值或固定长数据的slice,或指向此类数据的指针。写入w的字节流可用特殊的字节序来编码。另外,结构体中的(_)名的字段讲忽略。

代码案例:

package mainimport ("bytes""math""encoding/binary""log""fmt"
)func main() {buf := new(bytes.Buffer)pi := math.Pierr := binary.Write(buf, binary.LittleEndian, pi)if err != nil {log.Fatalln(err)}fmt.Println(buf.Bytes())
}

3)func Size(v interface{}) int

参数列表:v  需要计算长度的数据
返回值:int 数据序列化之后的字节长度
功能说明:
Size讲返回数据系列化之后的字节长度,数据必须是固定长数据类型、slice和结构体及其指针。

代码实例

package mainimport ("fmt""encoding/binary"
)func main() {var a intp := &ab := [10]int64{1}s := "adsa"bs := make([]byte, 10)fmt.Println(binary.Size(a)) // -1fmt.Println(binary.Size(p)) // -1fmt.Println(binary.Size(b)) // 80fmt.Println(binary.Size(s)) // -1fmt.Println(binary.Size(bs))    // 10
}

相关文章:

  • 分布式事务的解决方案--Seata架构
  • Linux的基本使用
  • vue3+threejs新手从零开发卡牌游戏(七):创建卡组
  • 掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
  • 重磅|国家能源局开展配电网安全风险管控重点行动
  • 微前端架构
  • 实验三 前端性能优化-CSS优化
  • Unity InputField实现框自适应内容简便方法
  • 自动化测试 —— 基于Jmeter之DDT!
  • 设计模式:面向对象设计的六大原则
  • 以太网网络变压器
  • Vue3:路由的两种模式history模式和hash模式
  • laravel(源码笔记)Facades的调用过程
  • base64转图片util
  • C语言学习笔记day8
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Apache Zeppelin在Apache Trafodion上的可视化
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • canvas绘制圆角头像
  • Git 使用集
  • MySQL QA
  • MySQL主从复制读写分离及奇怪的问题
  • nodejs调试方法
  • Phpstorm怎样批量删除空行?
  • SAP云平台里Global Account和Sub Account的关系
  • Wamp集成环境 添加PHP的新版本
  • 初识 webpack
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 服务器从安装到部署全过程(二)
  • 为什么要用IPython/Jupyter?
  • 消息队列系列二(IOT中消息队列的应用)
  • 智能网联汽车信息安全
  • ​Java基础复习笔记 第16章:网络编程
  • # 数据结构
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (day 12)JavaScript学习笔记(数组3)
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (转)jdk与jre的区别
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .NET CLR基本术语
  • .net core 连接数据库,通过数据库生成Modell
  • .NET技术成长路线架构图
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • ::before和::after 常见的用法
  • :O)修改linux硬件时间
  • ??eclipse的安装配置问题!??
  • [android] 手机卫士黑名单功能(ListView优化)
  • [AutoSar NVM] 存储架构
  • [C# 网络编程系列]专题六:UDP编程
  • [Codeforces] probabilities (R1600) Part.1
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [Grafana]ES数据源Alert告警发送
  • [HackMyVM]靶场 Quick3