Доброго дня!
Столкнулся с проблемой декомпрессией потока.
Суть такая, в документации описано что мы должны подсовывать функции 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);