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

Reading raw byte data from a file and decoding it to a protobuf structs

我在这里尝试做的事情:我从 Kafka 流中转储了一个未知数量的以二进制格式存储的 photobuff 记录。我想解码它们并以 JSON 格式将它们一一打印到控制台。 我在整个互联网上都看过了,但似乎没有关于从其中包含未知数量的 photobuff 记录的原始二进制文件读取数据的明确答案。 我找到了这个: 但它与使用 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
        }
    }
}

如果有人能指出如何将原始二进制文件正确解码为 protobuffs 的方向,我将不胜感激。

原始消息本身没有长度,也没有消息结束指示。

如果您的文件包含全部挤在一起的编组原型消息,则无法单独解码它们。尝试将多条消息解码为一条消息会将所有消息解码为一个结构,并在处理过程中覆盖每个字段。

如果您的文件包含以长度为前缀的消息(参见 buffer.EncodeMessage),那么您的示例代码应该能够解码它们(并在 EOF 时出现恐慌)。但我怀疑它们是那样连载的。