URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1168
[ Назад ]

Исходное сообщение
"Использование библиотеки bzlib в программе..."

Отправлено Sergey , 09-Дек-02 10:52 
Господа, помогите, если не сложно...Требуется в программе упаковывать/распаковывать данные. Использую библиотеку libbz2 (bzlib.h), но второй день никак не получается создать работающий примерчик, в мануале дается описание функций, но экзамплов не преведено... Может кто даст исходники примера или посоветует другую библиотеку (с более доходчивым описанием). Был бы очень признателен, с уважением, Сергей.

Содержание

Сообщения в этом обсуждении
"RE: Использование библиотеки bzlib в программе..."
Отправлено qq , 09-Дек-02 11:52 
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);


"RE: Использование библиотеки bzlib в программе..."
Отправлено qq , 09-Дек-02 12:15 
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);
.. читаем еще...


"RE: Использование библиотеки bzlib в программе..."
Отправлено qq , 09-Дек-02 12:18 

ну и в начале не забыть
    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);}

"RE: Использование библиотеки bzlib в программе..."
Отправлено Sergey , 09-Дек-02 12:46 
Спасибо, ща попробую...


"Э-э...Не работает.."
Отправлено Sergey , 09-Дек-02 13:39 
Да вроде то же самое и делал, а всё одно не работает как хотелось бы...
Вот код:

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;
};


"RE: Э-э...Не работает.."
Отправлено Sergey , 09-Дек-02 13:47 
На выходе получаю пустую строку...

"RE: Э-э...Не работает.."
Отправлено qq , 09-Дек-02 17:25 
>На выходе получаю пустую строку...


unzstr.avail_in = strlen(outbuf);
в этом проблема
никто не гарантирует того что компрессированные данные не содержат нулей
используйте
...
    res = BZ2_bzCompress (&zstr,BZ_FINISH);
    cout << res<<endl;

    n = sizeof(outbuf)-zstr.avail_out;
....
   unzstr.avail_in = n;