无法使用goprotobuf解码消息

时间:2014-04-25 00:46:58

标签: go protocol-buffers

我有以下原型文件:

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. 尝试将缓冲区解组为狗。
  4. - 开始代码 -

    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成功解码为

    的狗
    • 姓名:Fido
    • 品种:猎犬
    • nbLegs:4
    • nbTeeth:24

    在go程序中解组,总是返回错误"非法标记0"。

    我怀疑我误解了解码API,但到目前为止,我无法理解。

1 个答案:

答案 0 :(得分:0)

尝试使用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)

}