从文件中读取原始字节数据并将其解码为原型字节结构

我在这里想做的是:我有一个来自Kafka流的转储,其中以二进制格式存储了未知数量的photobuff记录。我想解码它们并以JSON格式逐个打印到控制台。我已经浏览了整个互联网,但似乎没有明确的答案,从原始二进制文件中读取数据,其中包含未知数量的photobuff记录。我发现了这个:如何解码二进制/原始谷歌protobuf数据,但它与使用protoc对一个已知记录的简单解码有关

我已经尝试了以下内容,但我似乎并不完全了解如何使用proto.buffer.go结构,因为我只能看到所有26 kb数据中的第一个值。

package main


import (

    "encoding/json"

    "fmt"

    "github.com/golang/protobuf/proto"

    "io/ioutil"

    "parseRawDHCP/pb"

)


func main() {

    file, err := ioutil.ReadFile("file")

    if err != nil {

        fmt.Printf("unable to read file %v", err)

    }

    msg := pb.Msg{}

    buffer := proto.NewBuffer(file)

    for {

        err := buffer.DecodeMessage(&msg)

        if err != nil {

            panic("unable to decode message")

        }

        marshalledStruct, err := json.Marshal(msg)

        if err != nil {

            panic("can't marshalledStruct the data from message")

        }

        if err == nil {

            fmt.Printf("message is: %v", marshalledStruct)

            continue

        }

    }

}

如果有人能为我指出如何正确地将原始二进制解码为原型,我将不胜感激。


宝慕林4294392
浏览 106回答 1
1回答

交互式爱情

原型消息本身没有长度,也没有消息结束指示。如果您的文件包含所有卡在一起的编组原型消息,则无法单独对其进行解码。尝试将多条消息解码为单个消息会将所有内容解码为单个结构,并在继续时覆盖每个字段。如果文件包含以长度为前缀的消息(请参阅缓冲区。编码消息),然后您的示例代码应该能够解码它们(并在EOF时恐慌)。但我怀疑他们是那样连载的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go