如何编写带有字节嵌入消息的原型文件

Posted

技术标签:

【中文标题】如何编写带有字节嵌入消息的原型文件【英文标题】:how to write proto file with bytes embedded message 【发布时间】:2015-06-19 09:30:56 【问题描述】:

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

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;
        ...

【问题讨论】:

我想通了。 【参考方案1】:

您提供的字节似乎缺少一个字节。我在末尾添加了一个 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 在技术上可以是任何整数类型。

【讨论】:

【参考方案2】:

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

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

【讨论】:

这是一个 protobuf 编码的消息。我已经在问题的项目符号中解释了消息的内容。 我明白了,抱歉,我误解了你的问题。听起来您在描述其他一些非 protobuf 二进制格式,然后尝试为它编写一个 proto 文件。 (这是人们有时会犯的错误。)我会尝试再次回答。

以上是关于如何编写带有字节嵌入消息的原型文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bash 编写二进制文件?

我的反应角色机器人编写了嵌入消息,但反应没有添加角色

如何使用嵌入式 id 编写 JPQL SELECT?

如何将字节数组转换为音频文件?

如何编写带有目标“错误”的makefile?

如何将嵌入消息颜色更改为白色? [复制]