• 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
    
    • 1
    • 2
    • 3

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结构体

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

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

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

    代码案例

    package main
    
    import (
        "fmt"
        "log"
        "bytes"
        "encoding/binary"
    )
    
    func main() {
        var pi float64
        b := []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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

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

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

    代码案例:

    package main
    
    import (
        "bytes"
        "math"
        "encoding/binary"
        "log"
        "fmt"
    )
    
    func main() {
        buf := new(bytes.Buffer)
        pi := math.Pi
    
        err := binary.Write(buf, binary.LittleEndian, pi)
        if err != nil {
            log.Fatalln(err)
        }
        fmt.Println(buf.Bytes())
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3)func Size(v interface{}) int

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

    代码实例

    package main
    
    import (
        "fmt"
        "encoding/binary"
    )
    
    func main() {
        var a int
        p := &a
        b := [10]int64{1}
        s := "adsa"
        bs := make([]byte, 10)
    
        fmt.Println(binary.Size(a)) // -1
        fmt.Println(binary.Size(p)) // -1
        fmt.Println(binary.Size(b)) // 80
        fmt.Println(binary.Size(s)) // -1
        fmt.Println(binary.Size(bs))    // 10
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    AndroidStudio编译错误‘android.injected.build.density‘ is deprecated
    独家 | 如何比较两个或多个分布形态(附链接)
    c++day5
    【Spring】一个spring简单实例
    vue+vite+ts添加eslint校验和代码提交校验
    测试应届生是去自研小公司好还是外包公司好?
    中加石墨再冲刺港交所上市:2022年初至今收入为零,陈东尧为CEO
    C语言学习笔记(二二)
    聊聊 RocketMQ 名字服务
    【Go语言】Go项目工程管理
  • 原文地址:https://blog.csdn.net/qq_39852676/article/details/136779878