如何使用 protoc 将协议缓冲区字符串编码为二进制

kpa*_*vel 8 protocol-buffers protoc protobuf.js protobufjs

我一直在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

result.out 包含:

^R^Qmy_testing_string
Run Code Online (Sandbox Code Playgroud)

协议版本 libprotoc 3.6.0 和 libprotoc 2.5.0

Mar*_*ell 3

只是为了正式回答:

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

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

我猜你的文件实际上是:

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

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