LINUX.ORG.RU

Декомпрессия bz2 потока

 


0

1

Доброго дня!

Столкнулся с проблемой декомпрессией потока.

Суть такая, в документации описано что мы должны подсовывать функции BZ2_bzDecompress() два буфера, в первом содержатся сжатые данные во втором разжатые. Все работает, доколе поток целиком умещается во входящий буфер, но если поток больше размера буфера, и требуется несколько проходов, мы имеем BZ_DATA_ERROR. Я грешу на то что в буфер не влезает MAGIC от блока, и данные каки-то образом крешаться, но в описании библиотеки ничего не сказано о потребности в контроле.

Ниже привожу пример «грязного», очень «грязного» кода:

#define CHUNK 64
int res = 0;

unsigned char in[CHUNK];
unsigned char out[CHUNK*1000];

FILE *f_in = fopen("/test.bz2","rb");
bz_stream strm;

strm.opaque = NULL;
strm.bzfree = NULL;
strm.bzalloc = NULL;

res = BZ2_bzDecompressInit(&strm,0,0);

strm.next_in = in;
strm.avail_out = CHUNK*1000;
strm.next_out = out;

res = BZ_OK;
while(  res != BZ_STREAM_END ){

     strm.avail_in = fread(in,1,CHUNK,f_in);
     res = BZ2_bzDecompress(&strm);
 
     if(res != BZ_OK && res != BZ_STREAM_END)
        exit(1);

     strm.avail_out = CHUNK*1000;
};

BZ2_bzDecompressEnd(&strm);
Заранее благодарен

http://sunsite.ualberta.ca/Documentation/Misc/bzip2-0.9.5d/html_node/bzip2_1.html#SEC23

Before each call to bzDecompress, next_in should point at the compressed data, and avail_in should indicate how many bytes the library may read. bzDecompress updates next_in, avail_in and total_in to reflect the number of bytes it has read.

По идее тебе нужно делать strm.next_in = in; в теле цикла.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

Работает!

Уважаемый, благодарствую! Действительно, видимо замылились глаза!

После каждого прохода strm.next_in «теряет» адрес входящего буфера.

Еще раз благодарю!

otvertochnic
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.