0

我有一个编码的二进制文件如下:

0a 16 0a 06 72 63 6e 33 31 72 12 0a 65 37 36 30 34 32 33 35 32 37 1a 00
20 01 2a 06 34 34 38 37 38

我不确定如何编写反映二进制文件的 proto 文件。我知道消息内容。

1. First two bytes indicate an embedded message with 22 bytes in length.
2. Inside the embedded message there are three fields (three strings).
3. Then the rest of the message with two fields.

如何编写 .proto 文件以反映上述二进制文件?

message UserInfo
{
        required string username = 1;
        required string usserId  = 2;
        optional string extraInfo= 3;
}

message SendUserRequest
{
        required UserInfo uinfo = 1;
        ...
}
4

2 回答 2

0

您提供的字节似乎缺少一个字节。我在末尾添加了一个 0,然后运行它protoc --decode_raw并得到了这个:

1 {
  1: "rcn31r"
  2: "e760423527"
  3: ""
}
4: 1
5: "44878\000"  // (my added zero byte shows up here)

因此,除了您编写的内容之外,您还SendUserRequest应该包含另外两个字段:

optional int32 a = 4;
optional string b = 5;

请注意,无法判断这些字段的正确名称应该是什么,也无法判断它们是必需的还是可选的。此外,a从技术上讲,它可以是任何整数类型。

于 2015-06-24T17:45:25.153 回答
-1

抱歉,但这不是 Protobuf 的用途。Protobuf 只能解码 Protobuf 格式;它不能匹配任意的 ad-hoc 字节格式。

编辑:我误解了这个问题。有时人们认为 Protobufs 可以描述任意二进制文件,并且给出的确切字节被拒绝protoc --decode_raw,但事实证明有一个丢失的字节。我在上面添加了一个更好的答案。

于 2015-06-20T07:54:39.713 回答