从文件中读取原始字节数据并将其解码为 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 时出现恐慌)。但我怀疑它们是那样连载的。
我在这里尝试做的事情:我从 Kafka 流中转储了一个未知数量的以二进制格式存储的 photobuff 记录。我想解码它们并以 JSON 格式将它们一一打印到控制台。
我在整个互联网上都看过了,但似乎没有关于从其中包含未知数量的 photobuff 记录的原始二进制文件读取数据的明确答案。
我找到了这个:
我尝试了以下方法,但我似乎不完全理解如何使用 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 时出现恐慌)。但我怀疑它们是那样连载的。