この質問とは関係のない理由で、バイナリファイルを分割して結合しようとしています
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
任意の null バイトのために切り捨てられることなく、protobuf に入力したものを正確に出力するにはどうすればよいですか?