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

Protocol buffers 如何使用protoc将协议缓冲字符串编码为二进制,protocol-buffers,protoc,protobuf.js,protobufjs,google-protocol-buffer,Protocol Buffers,Protoc,Protobuf.js,Protobufjs,Google Protocol Buffer,我一直在尝试使用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.ou

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

只是为了在回答中形式化:

书面命令应该是好的;输出是protobuf二进制文件-它与文本非常相似,因为protobuf使用utf-8对字符串进行编码,而您的内容由字符串控制。然而,尽管如此:文件实际上不是文本,如果需要检查它,通常应该使用十六进制查看器或类似工具

如果你想了解一个文件的内部结构,它是一个很好的资源——它按照协议规则撕开一个输入文件或十六进制字符串,并告诉你每个字节的含义(字段头、长度前缀、有效负载等)

我猜你的文件实际上是:

(十六进制)10116D795F等


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

您确定它工作不正常吗?将其显示到控制台必然会导致问题-控制台是文本,而不是二进制。但通过管道将其传输到一个文件,它可能是正确的。您可以在进行测试-只需将您的测试文件上传到那里,然后查看它的功能it@MarcGravell我想这正是我在上面的例子中所做的。。。将编码输出管道化到文件result.outOk,我的错误。现在:您正在显示文本-该文件的十六进制是什么?将其视为文本注定要失败。请注意,由于protobuf将字符串编码为utf8,因此您的文本应显示为“原样”。这里我感兴趣的是文件的前6个字节(大约)。作为十六进制,而不是字符。注意-我认为上面的解码页面将显示十六进制,如果你上传一个file@MarcGravell谢谢你说得对。上面的解码页面确实显示了预期的十六进制。
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