bzip2 1.0.6
タスク: ネットワーク パケットを圧縮します。問題: bzip2 "BZ_FLUSH" が機能せず、"BZ_FINISH" のみが機能していますが、現在のデータをフラッシュし、パケットごとに個別のストリームではなく、接続ごとにストリームを保持する必要があります。
このコードには #if プリプロセッサ タグがあります。"#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;
}