を使用して出力を圧縮ファイル (gz、bz2、...) に書き込むにはどうすればよいfstream
ですか? Boostライブラリでそれができるようですが、Boost以外のソリューションを探しています。圧縮ファイルからの読み取りのみの例を見ました。
2 に答える
圧縮データをファイルに書き込むには、 zlib (DEFLATE の場合、.zip および .gz ファイルで使用される圧縮アルゴリズム) またはxz utils (LZMA の場合、7zip で使用される圧縮アルゴリズム)などの圧縮ライブラリを介して非圧縮データを実行します。および .xz ファイル)、ofstream
またはを使用して通常どおり結果を書き込みますfwrite
。
実装する 2 つの主要な部分は、エンコード/圧縮とフレーミング/カプセル化/ファイル形式です。
ウィキペディアから、DEFLATE アルゴリズム:
ストリーム形式
Deflate ストリームは、一連のブロックで構成されます。各ブロックの前には 3 ビットのヘッダーがあります: 1 ビット: ストリーム内の最後のブロック マーカー: 1: これはストリーム内の最後のブロックです。0: このブロックの後に処理するブロックがさらにあります。2 ビット: このブロック タイプに使用されるエンコード方法: 00: 長さが 0 ~ 65,535 バイトの格納/生/リテラル セクション。01: 事前に合意されたハフマン木を使用した、静的ハフマン圧縮ブロック。10: 提供されたハフマン テーブルを備えた圧縮ブロック。11: 予約済み、使用しないでください。ほとんどのブロックは、方法 10 の動的ハフマン エンコーディングを使用してエンコードされることになります。これは、データの各ブロックごとに個別にカスタマイズされた最適化されたハフマン ツリーを生成します。必要なハフマン木を生成する命令は、ブロック ヘッダーの直後に続きます。圧縮は、重複する文字列の照合とポインターによる置換という 2 つの手順で行われます。シンボルの使用頻度に基づいて、重み付けされた新しいシンボルに置き換えます。
ウィキペディアから、gzip
ファイル形式:
「gzip」は、gzip ファイル形式を指す場合にもよく使用されます。これは、マジック ナンバー、バージョン番号、およびタイムスタンプを含む 10 バイトのヘッダーです。元のファイル名などのオプションの追加ヘッダー、本文を含むDEFLATE で圧縮されたペイロード CRC-32 チェックサムと元の圧縮されていないデータの長さを含む 8 バイトのフッター