いくつかのbzip2
アーカイブで構成された連結ファイルがあります。bzip2
また、そのファイル内の個々のチャンクのサイズも知っています。
bzip2
個々の bzip2 データ チャンクからストリームを解凍し、出力を標準出力に書き込みたいと考えています。
まずfseek
、ファイル カーソルを目的のアーカイブ バイトに移動してから、ファイルの「サイズ」チャンクをBZ2_bzRead
呼び出しに読み込みます。
int headerSize = 1234;
int firstChunkSize = 123456;
FILE *fp = fopen("pathToConcatenatedFile", "r+b");
char *bzBuf = malloc(sizeof(char) * firstChunkSize);
int bzError, bzNBuf;
BZFILE *bzFp = BZ2_bzReadOpen(&bzError, *fp, 0, 0, NULL, 0);
# move cursor past header of known size, to the first bzip2 "chunk"
fseek(*fp, headerSize, SEEK_SET);
while (bzError != BZ_STREAM_END) {
# read the first chunk of known size, decompress it
bzNBuf = BZ2_bzRead(&bzError, bzFp, bzBuf, firstChunkSize);
fprintf(stdout, bzBuf);
}
BZ2_bzReadClose(&bzError, bzFp);
free(bzBuf);
fclose(fp);
fprintf
問題は、ステートメントの出力とコマンド ラインで実行した出力を比較すると、bzip2
2 つの異なる答えが得られることです。
bzip2
具体的には、このコードから得られる出力は、コマンド ラインで実行した場合よりも少なくなります。
より具体的には、このコードからの出力は、コマンド ライン プロセスからの出力の小さなサブセットであり、対象の bzip2 チャンクの末尾にあるものを見逃しています。
コマンドラインbzip2
が正しい答えを提供していることを別の手法で確認しました。そのため、C コードの問題により、チャンクの最後の出力が失われています。その問題が何であるかはわかりません。
bzip2
またはに精通している場合はlibbzip2
、上記のコード サンプルで間違っている点について何かアドバイスをいただけますか? アドバイスありがとうございます。