我正试图拆分并合并一个二进制文件,出于与该问题无关的原因,我正在使用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中的内容,而不会由于任意空字节而被截断?
答案 0 :(得分:0)
如果传递字符串文字,则它将照原样对待,并且仅读取到第一个空终止符为止。
相反,可以像上一个示例一样直接传递std::string
。
请参见https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#oneof中的“奇异字符串字段(proto3)”