gpt4 book ai didi

go - 无法使用 goprotobuf 解码消息

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:14 25 4
gpt4 key购买 nike

我有以下原型(prototype)文件:

package dogs;

enum Breed {
terrier = 0;
shepherd = 1;
hound = 2;
};

message Dog {
required int64 nbLegs = 1;
optional int64 nbTeeth = 2 [default=24];
optional Breed breed = 3;
optional string name = 4;
}

以及下面使用goprotobuf包编写的Go程序。程序

  1. 从 stdin 读取 Varint 以获得编码消息的长度,
  2. 从 stdin 中读取该字节数到缓冲区中,并且
  3. 尝试将缓冲区解码为 Dog。

--开始代码--

package main

import "bufio"
import "encoding/binary"
import "os"
import "log"
import "fmt"
import "dogs"
import "code.google.com/p/goprotobuf/proto"

func render(dog *dogs.Dog) string {
return fmt.Sprintf("Dog: %v %v %v %v", dog.GetName(), dog.GetBreed(), dog.GetNbLegs(), dog.GetNbTeeth())
}

func main() {
var dog = new(dogs.Dog)
stdin := bufio.NewReader(os.Stdin)
sz, _ := binary.ReadVarint(stdin)
bytes := make([]byte, sz)
os.Stdin.Read(bytes)
buf := proto.NewBuffer(bytes)
err := buf.Unmarshal(dog)
if err != nil {
log.Fatal(err)
}
fmt.Fprintf(os.Stderr, "Receiving %s of length %d\n", render(dog), sz)

}

--结束代码--

这个编码的消息(前面有一个 Varint)(以 hexdump 形式)

0000000: 1408 0418 0222 0446 6964 6f              .....".Fido

我可以使用 C++ 和 libprotobuf 作为 Dog 成功解码

  • 姓名:菲多
  • 品种:猎犬
  • nb腿:4
  • nb dentry :24

然而,在 go 程序中解码总是返回错误“非法标记 0”。

我怀疑我误解了解码 API,但到目前为止,我不明白是怎么回事。

最佳答案

尝试只对字节进行 umarshalling 而不是像这样创建缓冲区:您可能还想检查 os.Stdin.Read(bytes) 是否真的在读取 sz。

func main() {
var dog = new(dogs.Dog)
stdin := bufio.NewReader(os.Stdin)
sz, _ := binary.ReadVarint(stdin)
bytes := make([]byte, sz)
stdin.Read(bytes)
err := buf.Unmarshal(dog, bytes)
if err != nil {
log.Fatal(err)
}
fmt.Fprintf(os.Stderr, "Receiving %s of length %d\n", render(dog), sz)

}

关于go - 无法使用 goprotobuf 解码消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23282321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com