У меня есть объединенный файл, состоящий из некоторого количества bzip2
архивов.Я также знаю размеры отдельных bzip2
кусков в этом файле.
Я хотел бы распаковать поток bzip2
из отдельного блока данных bzip2 и записать вывод в стандартный вывод.
Сначала я использую fseek
, чтобы переместить курсор файла кжелаемый байт архива, а затем считайте «size» -часть файла в вызове 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
в командной строке, я получаю два разных ответа.
В частности, я получаю меньше выходных данных из этого кода, чем при запуске bzip2
в командной строке.
Более конкретно, мои выходные данные из этого кода представляют собой меньшее подмножество выходных данных процесса командной строки, и мне не хватает того, что находится в хвостовой части интересующего блока bzip2.
Я проверил с помощью другого метода, что командная строка bzip2
предоставляет правильный ответ, и, следовательно, некоторая проблема с моим кодом C приводит к тому, что выходные данные в конце фрагмента пропадают.Я просто не знаю, что это за проблема.
Если вы знакомы с bzip2
или libbzip2
, можете ли вы дать какой-либо совет, что я делаю неправильно в приведенном выше примере кода?Спасибо за ваш совет.