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

克鲁比乌斯

我正试图拆分并合并一个二进制文件,出于与该问题无关的原因,我正在使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用JdbcTemplate将字节数组存储到MySQL二进制列中

计数二进制文件中字节模式的出现

将 N 个原始二进制字节精确写入 C 中的文件

获取存储在二进制字段签名中的类型

将文件存储在可执行二进制文件中

将二进制数据存储在静态数组中

如何将二进制文件存储在sql数据库中?

如何将Flask收到的二进制文件存储到postgres中

如何决定是将二进制数据存储在Postgres还是文件中?

将字典存储在二进制文件中时,键值对无法正常工作,为什么?

Unix理念-避免将数据和程序存储在二进制文件中

将数字数据存储在二进制文件和数据结构中

编译后如何将整数存储在二进制文件中?

如何获取存储在字节数组中的字节的二进制值

获取存储在存储二进制数据的数据列中的字节长度

将二进制文件读入bash中的变量

将二进制文件读入MIPS中的数组

将尾随换行符作为字节写入 Scheme 中的二进制输出文件

递归查找二进制文件中的十六进制字节

C中的二进制文件

从二进制文件中读取

以MYSQL二进制数据类型存储128位二进制数

MySQL:如何使用HEX将文件存储到中等Blob字段二进制文件中

霍夫曼压缩读取文件不会复制二进制文件C ++中的所有字节

从二进制文件读取n个字节,直到verilog中的文件结尾

将二进制文件读入结构体以及字节序问题

将 32 字节二进制大端文件(LiDAR 数据)转换为 python 列表或数组

如何将整数拆分为2个字节的二进制文件?

将 size_t 字节写入二进制文件