ZhangZhihui's Blog  

Problem: You want to decode the customized binary format back to structs.


Solution: Use the encoding/binary package to take data from the binary format and reconstruct structs from it.

 

复制代码
func main() {
    var data Meter
    file, err := os.Open("data.bin")
    if err != nil {
        log.Println("Cannot read file:", err)
    }
    defer file.Close()

    err = binary.Read(file, binary.BigEndian, &data)
    if err != nil {
        log.Println("Cannot read binary:", err)
    }
}
复制代码

Start with creating a struct to contain your data. Instead of Write you use Read , passing the reader to it, the byte order, and the struct instance you want to store data. This will read the bytes from the file and write them to the struct.

Here’s how you can do it manually, instead of using a one - liner like Read :

复制代码
func main() {
    var data Meter
    file, err := os.Open("data.bin")
    if err != nil {
        log.Println("Cannot read file:", err)
    }
    defer file.Close()

    buf := make([]byte, 24)
    file.Read(buf)

    data.Id = binary.BigEndian.Uint32(buf[:4])
    data.Voltage = math.Float32frombits(binary.BigEndian.Uint32(buf[4:8]))
    data.Current = math.Float32frombits(binary.BigEndian.Uint32(buf[8:12]))
    data.Energy = binary.BigEndian.Uint32(buf[12:16])
    data.Timestamp = binary.BigEndian.Uint64(buf[16:])
    fmt.Printf("%+v\n", data)
}
复制代码

As expected, the single function decoding takes longer than with gob, but the performance is fast when you manually decode the data into structs. It’s a bit more tedious to code, but the performance is there if you need it.

zzh@ZZHPC:/zdata/MyPrograms/Go/study$ go run main.go
{Id:123456 Voltage:229.5 Current:1.3 Energy:4321 Timestamp:1698112626166701163}

 

posted on   ZhangZhihuiAAA  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
 
点击右上角即可分享
微信分享提示