bzip2: пиши ок, флеш ок, чтение не получилось

bzip2 1.0.6

Задача: сжимать сетевые пакеты.
Проблема: bzip2 «BZ_FLUSH» не работает, работает только «BZ_FINISH», но мне нужно очищать текущие данные и сохранять поток для каждого соединения, а не отдельный поток для каждого пакета.

В этом коде есть тег препроцессора #if:
«#if 0» (что сейчас) завершает работу bzip2 — и это работает;
«#if 1» делает bzip2 сброшенным — не работает (навсегда застрял в чтении).

#include <bzlib.h>
#include <memory.h>
#include <assert.h>
#include <iostream>
using namespace std;

int main()
{
typedef unsigned char U1;
U1 temp[10000];
size_t temp_count;

U1 bbb[256];
for ( size_t i=0; i<sizeof(bbb); ++i )
bbb[i] = i;

{
bz_stream s;
memset(&s,0,sizeof(s));
BZ2_bzCompressInit(&s,1,4,0);
s.next_in = (char*)&bbb[0];
s.avail_in = sizeof(bbb);
s.next_out = (char*)&temp[0];
s.avail_out = sizeof(temp);
do
{
int res = BZ2_bzCompress(&s,BZ_RUN);
assert( res == BZ_RUN_OK );
cout << "s.avail_in=" << s.avail_in << endl;
}
while ( s.avail_in );
#if 0
do
{
int res = BZ2_bzCompress(&s,BZ_FLUSH);
cout << "res=" << res << endl;
cout << "s.avail_in=" << s.avail_in << endl;
if ( res == BZ_RUN_OK )
break;
assert( res == BZ_FLUSH_OK );
}
while ( true );
#else
do
{
int res = BZ2_bzCompress(&s,BZ_FINISH);
cout << "res=" << res << endl;
cout << "s.avail_in=" << s.avail_in << endl;
if ( res == BZ_STREAM_END )
break;
assert( res == BZ_FINISH_OK );
}
while ( true );
#endif
temp_count = sizeof(temp) - s.avail_out;
BZ2_bzCompressEnd(&s);
cout << "temp_count=" << temp_count << endl;
}

memset( &bbb[0], 0, sizeof(bbb) );

{
bz_stream s;
memset(&s,0,sizeof(s));
BZ2_bzDecompressInit(&s,4,0);
s.next_in = (char*)&temp[0];
s.avail_in = temp_count;
s.next_out = (char*)&bbb[0];
s.avail_out = sizeof(bbb);
do
{
cout << "s.avail_in=" << s.avail_in << endl;
int res = BZ2_bzDecompress(&s);
cout << "res=" << res << endl;
cout << "s.avail_out=" << s.avail_out << endl;
if( res == BZ_OK )
continue;
assert( res == BZ_STREAM_END );
assert( !s.avail_in );
break;
}
while ( true );
BZ2_bzDecompressEnd(&s);
}

for ( size_t i=0; i<sizeof(bbb); ++i )
assert( bbb[i] == i );

return 0;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …