The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Использование библиотеки bzlib в программе..."
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

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

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Использование библиотеки bzlib в программе..."
Сообщение от qq Искать по авторуВ закладки on 09-Дек-02, 12:18  (MSK)

ну и в начале не забыть
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);}
  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Использование библиотеки bzlib в программе..."
Сообщение от Sergey emailИскать по авторуВ закладки on 09-Дек-02, 12:46  (MSK)
Спасибо, ща попробую...

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Э-э...Не работает.."
Сообщение от Sergey emailИскать по авторуВ закладки on 09-Дек-02, 13:39  (MSK)
Да вроде то же самое и делал, а всё одно не работает как хотелось бы...
Вот код:

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "RE: Э-э...Не работает.."
Сообщение от Sergey emailИскать по авторуВ закладки on 09-Дек-02, 13:47  (MSK)
На выходе получаю пустую строку...
  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "RE: Э-э...Не работает.."
Сообщение от qq Искать по авторуВ закладки on 09-Дек-02, 17:25  (MSK)
>На выходе получаю пустую строку...


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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру