我正试图拆分并合并一个二进制文件,出于与该问题无关的原因,我正在使用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中的内容,而不会由于任意空字节而截断?
如果您传递字符串文字,则它将照原样对待它,直到第一个空终止符才读取。
相反,您可以std::string
像上一个示例一样直接传递a 。
请参阅https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#oneof中的“单个字符串字段(proto3)”
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句