Господа, помогите, если не сложно...Требуется в программе упаковывать/распаковывать данные. Использую библиотеку libbz2 (bzlib.h), но второй день никак не получается создать работающий примерчик, в мануале дается описание функций, но экзамплов не преведено... Может кто даст исходники примера или посоветует другую библиотеку (с более доходчивым описанием). Был бы очень признателен, с уважением, Сергей.
compression - примерно так:stream.next_in=buf;
stream.next_out=outbuf;
stream.avail_out=sizeof(outbuf);n = read(fd_r, buf, sizeof(buf));
stream.avail_in=n;while( 0 != stream.avail_in )
{
if(BZ_RUN_OK != BZ2_bzCompress(&stream,BZ_RUN)) {
fprintf(stderr,"compress error\n");
exit(1);
}
if( 0 == stream.avail_out )
{
write(fd_w, outbuf,sizeof(outbuf));
stream.next_out=outbuf;
stream.avail_out=sizeof(outbuf);
}
}
write(fd_w, outbuf,sizeof(outbuf)-stream.avail_out);while(BZ_FINISH_OK == (result = BZ2_bzCompress(stream,BZ_FINISH))) {
if(0 == stream->avail_out ) {
write(fd_w, outbuf,sizeof(outbuf));
stream->next_out=outbuf;
stream->avail_out=sizeof(outbuf);
}
}
if( BZ_STREAM_END != result ) {
fprintf(stderr,"compress finishing error %d\n",result);
exit(1);
}
write(fd_w, outbuf,sizeof(outbuf)-stream->avail_out);
BZ2_bzCompressEnd(stream);
decompress:
[..инициализация та же..]while( 0 != stream.avail_in ) {
result = BZ2_bzDecompress(&stream);
if(BZ_STREAM_END == result) {
write(fd_w, outbuf,sizeof(outbuf)-stream.avail_out);
exit(0); // обработали все
}
if(BZ_OK != result) {
fprintf(stderr,"decompress error\n");
exit(1);
}
if( 0 == stream.avail_out ) {
write(fd_w, outbuf,sizeof(outbuf));
stream.next_out=outbuf;
stream.avail_out=sizeof(outbuf);
}
}
if(BZ_STREAM_END != result)
write(fd_w, outbuf,sizeof(outbuf)-stream.avail_out);
.. читаем еще...
ну и в начале не забыть
memset(&stream,0,sizeof(stream));
if(BZ_OK != BZ2_bzCompressInit(&stream,COMPRESSION_LEVEL,0,0))
{fprintf(stderr,"error initializing bzlib compress\n");exit(1);}
[..или..]
if(BZ_OK != BZ2_bzDecompressInit(&stream,0,0))
{fprintf(stderr,"error initializing bzlib decompress\n");exit(1);}
Спасибо, ща попробую...
Да вроде то же самое и делал, а всё одно не работает как хотелось бы...
Вот код:int main()
{
bz_stream zstr;
bz_stream unzstr;
char inbuf[255];
char outbuf[255];memset(&outbuf,0,sizeof(outbuf));
strcpy(inbuf,"AATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTZZ");
memset(&zstr,0,sizeof(zstr));
memset(&unzstr,0,sizeof(unzstr));int res = BZ2_bzCompressInit(&zstr,2,0,30);
cout<<res<<endl;zstr.next_in = inbuf;
zstr.next_out = outbuf;
zstr.avail_out = sizeof(outbuf);
zstr.avail_in = strlen(inbuf);res = BZ2_bzCompress (&zstr,BZ_FINISH);
cout << res<<endl;res = BZ2_bzCompressEnd (&zstr);
cout<<res<<endl;
cout<<"Decompress..."<<endl;
res = BZ2_bzDecompressInit (&unzstr, 0, 0 );
cout<<res<<endl;memset(&inbuf,0,sizeof(inbuf));
unzstr.next_in = outbuf; //на вход подаем результат сжатия
unzstr.next_out = inbuf;
unzstr.avail_out = sizeof(inbuf);
unzstr.avail_in = strlen(outbuf);res = BZ2_bzDecompress (&unzstr);
cout<<res<<endl;
cout<<inbuf<<endl; // По идее должны получить исходную строку
return 0;
};
На выходе получаю пустую строку...
>На выходе получаю пустую строку...
unzstr.avail_in = strlen(outbuf);
в этом проблема
никто не гарантирует того что компрессированные данные не содержат нулей
используйте
...
res = BZ2_bzCompress (&zstr,BZ_FINISH);
cout << res<<endl;n = sizeof(outbuf)-zstr.avail_out;
....
unzstr.avail_in = n;