1

この質問とは関係のない理由で、バイナリファイルを分割して結合しようとしています

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 に入力したものを正確に出力するにはどうすればよいですか?

4

1 に答える 1