0

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

0 に答える 0