zlibに投稿された gzip コードのアイデアを使用しています。初期化には を使用しますdeflateInit2(p_strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY)
。ストリームを圧縮しています。Z_FULL_FLUSH
私が使用する最後のものを除いて、各パケットにはZ_FINISH
. 各パケットを圧縮した後、パケットを並べ替えています。
パケット内のデータ ---> [zip] ---> [並べ替え] ---> ...
zip の後にデータを膨らませると、zip する前に正確なファイルを取得できます。Z_FULL_FLUSH
パケットの並べ替え後にデータを膨張させると (繰り返しますが、最後の を除いて、各パケットは で収縮されZ_FINISH
ます)、圧縮前の元のファイルと非常によく似たファイルが得られます。違いはファイルの最後にあります。バイトが不足しています。これは、膨らませているときに最後のパケットでエラーが発生するためです ( Z_DATA_ERROR
)。たとえば、50KB のチャンクで膨張させた場合、並べ替え後の膨張したファイルは入力と同じファイルであり、50KB 未満です (最後のパケット全体がエラーの原因になります)。膨張するチャンク サイズを 8B に減らしてもZ_DATA_ERROR
.
最後のパケット ( Z_FINISH
) を並べ替えていません。すべてのパケットを送信してZ_FULL_FLUSH
から、別の「空の」パケット ( Z_FINISH
10 バイトのみ) を送信しようとしました。
なぜこうなった?Z_FULL_FLUSH を使用すると、インフレータが正しく膨らませられないのはなぜですか? 収縮したパケットの順序を覚えていますか?
どんな情報でも役に立ちます、ありがとう。