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