将protobuf字节类型存储在二进制文件中

时间:2019-05-17 22:35:41

标签: c++ protobuf-c

我正试图拆分并合并一个二进制文件,出于与该问题无关的原因,我正在使用protobuf将文件char *存储为protobuf字节类型

序列化char *的代码如下:

char* buffer = new char[buffer_size];
ifstream fileStream;

fileStream.open(fileName,ios::in | ios::binary);

//stuff here

Data *data = new Data(); // Protobuf Constructor

fileStream.read(buffer, buffer_size);
data->set_payload(buffer);
data->set_piece_no(piece_no);

.proto文件:

 syntax = "proto3";
 message Data {
 int32 piece_no = 1;
 bytes payload = 2;
 }

然后我尝试将所有片段合并在一起:

ofstream fileOutput;
fileOutput.open("out.bin", ios::out | ios::binary);
fileOutput << data->payload();

但是遗憾的是,这不起作用,并且生成的二进制文件比原始文件小得多。

然后我怀疑这些字节可能具有空字符\ 0,结果这些字节实际上被截断了。

要检验我的假设,我执行以下操作:

Data *data = new Header();
data->set_payload("hel\0lo");
data->set_piece_no(piece_no);

ofstream fileOutput;
fileOutput.open("out.bin",ios::out | ios::binary);
fileOutput << data->payload();

在文本编辑器(vscode)中打开二进制文件将显示以下内容:

hel

但是以下代码:

string data("hel\0lo",6);
ofstream fileOutput;
fileOutput.open("out.bin", ios::out | ios::binary);
fileOutput << data;

显示以下内容:

hel?lo

我如何才能准确输出输入到protobuf中的内容,而不会由于任意空字节而被截断?

1 个答案:

答案 0 :(得分:0)

如果传递字符串文字,则它将照原样对待,并且仅读取到第一个空终止符为止。

相反,可以像上一个示例一样直接传递std::string

请参见https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#oneof中的“奇异字符串字段(proto3)”