4

我一直在尝试使用 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

4

2 回答 2

3

只是为了正式回答:

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

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

我猜你的文件实际上是:

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

即0x10 =“字段2,长度前缀”,0x11 = 17(有效载荷长度,编码为varint),然后“my_testing_string”编码为17字节的UTF8。

于 2018-06-28T23:23:41.807 回答
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
于 2019-11-12T05:28:39.010 回答