如何使用protoc解码protobuf文件

时间:2017-04-04 18:51:55

标签: protocol-buffers protoc

我对protoc的使用感到困惑,无法在互联网上找到有关其用法的例子: -

protoc -IPATH=path_to_proto_file_directory  path_to_proto_file --decode=MESSAGE_TYPE  < ./request.protobuf 

那么这里的message_type是什么,有人可以写一个完整正确的例子

2 个答案:

答案 0 :(得分:0)

syntax = "proto3";
package response;

// protoc --gofast_out=. response.proto

message Response {
  int64 UID        
  ....
}

use protoc:
protoc --decode=response.Response response.proto < response.bin
protoc --decode=[package].[Message type] proto.file < protobuf.response

or use: 
protoc --decode_raw < protobuf.response
without proto file.

答案 1 :(得分:0)

几年后,这是另一个答案。

# Check the version
protoc --version
>libprotoc 3.0.0

原始解码

您可以在没有架构(.proto 文件)的情况下使用 --decode_raw 选项。 考虑这个包含字节 0x08 0x01 的简单示例消息。 我假设一个带有 echo 的 Linux 环境

# Use echo to print raw bytes and don't print an extra `\n` newline char at the end
echo -en '\x08\x01' | protoc --decode_raw

# Output below. This means field 1 integer type with a value of 1
1: 1

使用模式解码(.proto 文件)

如果您有 proto 文件,那么您可以获得比 --decode_raw 更好的结果。如果您想使用新值对其进行编码,您甚至可以将 --decode 的输出发送回 protoc。

Example.proto 文件内容
syntax = "proto3";

message Test {
  int32 FieldOneNumber
}
# Decode the same message as the raw example against this schema
echo -en '\x08\x1' | protoc --decode="Test" --proto_path= ./Example.proto

# Output. Note that the generic field named 1 has been replaced by the proto file name of FieldOne.
FieldOne: 1