У меня есть составной файл, состоящий из некоторого количества 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
в командной строке, я получаю два разных ответа.
В частности, я получаю меньше результатов от этого кода, чем от запуска bzip2
в командной строке.
В частности, мой вывод из этого кода является меньшим подмножеством вывода из процесса командной строки, и мне не хватает того, что находится в хвостовой части интересующего фрагмента bzip2.
С помощью другого метода я проверил, что командная строка bzip2
дает правильный ответ, и, следовательно, какая-то проблема с моим кодом C приводит к тому, что вывод в конце фрагмента отсутствует. Я просто не знаю, что это за проблема.
Если вы знакомы с bzip2
или libbzip2
, можете ли вы дать совет, что я делаю неправильно в приведенном выше примере кода? Спасибо за ваш совет.
fprintf()
очень опасно - вам, вероятно, следует использоватьfputs()
или дажеfwrite()
, но в противном случае используйтеfprintf(stdout, "%s", bzBuf);
. - person Jonathan Leffler   schedule 12.10.2010fputs(bzBuf, stdout)
илиfprintf(stdout, "%s", bzBuf)
. Насколько мне известно, фрагментыbzip2
являются буквенно-цифровыми, символами новой строки и табуляции. Во входных данных, которые использовались для создания фрагментовbzip2
, нет символов процента или нулевых символов, которые можно успешно распаковать с помощью инструмента командной строкиbzip2
. - person Alex Reynolds   schedule 12.10.2010BZ2_bzRead()
и передfprintf()
. Однако это, скорее всего, приведет к дополнительным данным, чем к слишком малым. (Вы уверены, что ваш процесс дает меньший результат, чем bzip2?) - person Jonathan Leffler   schedule 12.10.2010fseek
в своем объединенном файле, я получаю меньший результат. Относится ли параметрsize
в API к размеру читаемого фрагментаbzip2
или к размеру несжатого вывода? Из чтения API кажется, что это первый вариант, но я вполне могу ошибаться. - person Alex Reynolds   schedule 12.10.2010strtok
дляbzBuf
, токенизируя новые строки, когдаbzBuf
, вероятно, не имеет всех данных, которые мне нужны, за один раз. Понятно, почему я теряю то, что в конце — размерbzBuf
— это размер архиваbzip2
, а не несжатых данных, и поэтому при следующей заливке вbzBuf
данные не разбиваются на новые строки. - person Alex Reynolds   schedule 12.10.2010BZ2_bzReadOpen()
не должен использоватьfp
вместо*fp
? - person mwag   schedule 27.09.2019