2017-07-06 7 views
3

zlibでデータを圧縮/解凍するには、まずz_streamという構造体を設定する必要があります。 z_streamには、next_innext_outという2つの非constポインタがあります。C++ - constデータでzlibを使用する

私はこのような機能を実行する場合:私は何をすべき

void ungzip(std::vector<unsigned char>& dst,const std::vector<unsigned char>& src) 
{ 
    z_stream strm; 
    // more code 
} 

およびその他のような、

void gzip (std::vector<unsigned char>& dst,const std::vector<unsigned char>& src); 

コピーローカルstd::vector<unsigned char>

std::vector<unsigned char> tmp(src); 

でsrcと、strm.next_in = const_cast<char*>(&src[0])このようなソースや設定のポインタとしてそれを使うのか?

zlibは入力データを保持しますか?

+0

私はイテレータを使って入力を受け付けることをお勧めします:このデザインでは、呼び出し側が 'vector 'にデータを格納するように制限します。 –

+1

zlibは入力データに触れません。それは 'const'であるかのように扱われます。 'next_in'はデフォルトでは' const'ではありません。多くのアプリケーションがzlibの外側で 'next_in'を使ってデータを読み込むためです。それを 'const'にすると、それらのアプリケーションが壊れるでしょう。 –

答えて

1

コンパイル時にZLIB_CONSTを定義して、入力ポインタがconst unsigned char *になるように定義するのが最も簡単な方法でしょう。

ただし、単純にconstアノテーションをキャストすることは実際にはうまくいくことに注意してください(指し示されている文字が実際には定数でない場合は正当です)。このため コードは次のようになります。

strm.next_in = (unsigned char *)&src[0]; 

または醜いconst_castバリアントあなたは、物事のようなものにしている場合。

+0

Linuxディストリビューションが提供するパッケージを使用している場合は、私のプログラム用にzlibを再構築する必要がありますか? –

+0

@ R.F.Luis:次にオプション2に進む: '(char *)&src [0]'; 'std :: vector'のデータをconstにすることはできませんので、constのままにしておくことは安全です。 – 6502

+0

srcは 'const std :: vector &'ですので、データは 'const'でなければならず、' const_cast'を使ってキャストする必要があります。オブジェクトが_const修飾されている場合は、変更できません。 –

関連する問題