为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
宝慕林4294392 2022-10-04 16:49:26
我在这里想做的是:我有一个来自Kafka流的转储,其中以二进制格式存储了未知数量的photobuff记录。我想解码它们并以JSON格式逐个打印到控制台。我已经浏览了整个互联网,但似乎没有明确的答案,从原始二进制文件中读取数据,其中包含未知数量的photobuff记录。我发现了这个:如何解码二进制/原始谷歌protobuf数据,但它与使用protoc对一个已知记录的简单解码有关我已经尝试了以下内容,但我似乎并不完全了解如何使用proto.buffer.go结构,因为我只能看到所有26 kb数据中的第一个值。package mainimport (    "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        }    }}如果有人能为我指出如何正确地将原始二进制解码为原型,我将不胜感激。
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

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

如果您的文件包含所有卡在一起的编组原型消息,则无法单独对其进行解码。尝试将多条消息解码为单个消息会将所有内容解码为单个结构,并在继续时覆盖每个字段。

如果文件包含以长度为前缀的消息(请参阅缓冲区。编码消息),然后您的示例代码应该能够解码它们(并在EOF时恐慌)。但我怀疑他们是那样连载的。


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号