Хранить тип байта protobuf внутри двоичного файла - PullRequest
1 голос
/ 18 мая 2019

Я пытаюсь разбить и объединить двоичный файл, по причине, не связанной с этим вопросом, я использую 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 file:

 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 голосов
/ 19 мая 2019

Если вы передадите строковый литерал, он будет обрабатываться как таковой и будет считываться только до первого нулевого терминатора.

Вместо этого вы можете передать std::string напрямую, как в вашем последнем примере.

См. В разделе «Поля единственного числа (proto3)» в https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#oneof

...