【问题标题】:How to encode protocol buffer string to binary using protoc如何使用 protoc 将协议缓冲区字符串编码为二进制
【发布时间】:2019-11-12 19:01:29
【问题描述】:

我一直在尝试使用 protoc cli 实用程序对字符串进行编码。 注意到输出仍然包含纯文本。 我做错了什么?

osboxes@osboxes:~/proto/bin$ cat ./teststring.proto
syntax = "proto2";
message Test2 {
  optional string b = 2;
}

echo b:\"my_testing_string\"|./protoc --encode Test2 teststring.proto>result.out

result.out 包含:

^R^Qmy_testing_string

protoc 版本 libprotoc 3.6.0 和 libprotoc 2.5.0

【问题讨论】:

  • 你确定它不能正常工作吗?将其显示到控制台必然会导致问题 - 控制台是文本,而不是二进制。但是将其通过管道传输到文件中,它可能是正确的。您可以在 protogen.marcgravell.com/decode 进行测试 - 只需将您的测试文件上传到那里,看看它是做什么的
  • @MarcGravell 我认为这正是我在上面的示例中所做的......将编码的输出管道传输到文件 result.out
  • 好吧,我错了。现在:您正在显示文本 - 该文件的 hex 是什么?将其视为文本注定要失败。请注意,由于 protobuf 将字符串编码为 utf8,因此您的文本应该“按原样”显示。我感兴趣的是文件的前 6 个(左右)字节。作为十六进制,而不是字符。
  • 注意——如果你上传文件,我认为上面的解码页面会显示十六进制
  • @MarcGravell 谢谢!你说得对。上面的解码页面确实显示了预期的十六进制。

标签: protoc protobuf.js protobufjs protocol-buffers


【解决方案1】:

只是为了正式回答:

所写的命令应该没问题;输出 is protobuf 二进制文件 - 它只是类似于文本,因为 protobuf 使用 utf-8 对字符串进行编码,并且您的内容以字符串为主。然而,尽管如此:该文件实际上不是文本,如果您需要检查它,您通常应该使用十六进制查看器或类似工具。

如果您想了解文件的内部结构,https://protogen.marcgravell.com/decode 是一个很好的资源 - 它按照协议规则撕开输入文件或十六进制字符串,并告诉您每个字节的含义(字段标题、长度前缀、有效负载等)。

我猜你的文件实际上是:

(十六进制)10 11 6D 79 5F 等

即0x10 = "field 2, length prefixed", 0x11 = 17 (payload length, 编码为 varint), 然后 "my_testing_string" 编码为 17 字节的 UTF8。

【讨论】:

    【解决方案2】:
    protoc --proto_path=${protobuf_path} --encode=${protobuf_message} ${protobuf_file} < ${source_file} > ${output_file}
    

    在这种情况下:

    protoc --proto_path=~/proto/bin --encode="Test2" ~/proto/bin/teststring.proto < ${source.txt} > ./output.bin
    

    或:

    cat b:\"my_testing_string\" | protoc --proto_path=~/proto/bin --encode="Test2" ~/proto/bin/teststring.proto > ./output.bin
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2014-02-21
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多