3

次のような.txtファイルがあるとします。

11111111111111Hello and welcome to stackoverflow. stackoverflow will hopefully provide me with answers to answers i do not know. Hello and goodbye.11111111111111

次に、同等のバイナリ形式(.binファイル)を次のように作成します。

Stream.Write(intBytes, 0, intBytes.Length); // 11111111111111
Stream.Write(junkText, 0, junkText.Length); // Hello and welcome to stackoverflow...
Stream.Write(intBytes, 0, intBytes.Length); // 11111111111111

最初の例は、2番目の例よりも圧縮率が高くなっています。11111111111111を取り外した場合、同じサイズに圧縮されます。ただし、11111を使用すると、.txtバージョンの圧縮率が向上します。

byte[] intBytes = BitConverter.GetBytes(11111111111111); // This is 8 bytes
byte[] strBytes = UTF8Encoding.UTF8.GetBytes("11111111111111"); // This is 14 bytes

これは、ネイティブC++Zlibライブラリを使用しています。

圧縮する前は、.binファイルのサイズが小さく、これを期待していました。

圧縮後、.txtバージョンのサイズが小さくなるのはなぜですか?同等のビンよりも圧縮率が高いようです。

binファイル:非圧縮サイズ:2448圧縮サイズ:177

txtファイル:非圧縮サイズ:2460圧縮サイズ:167

4

1 に答える 1

2

したがって、大きなファイルは小さなファイルに圧縮されます。私が提供できる2つの説明があります:

  1. 入力のエントロピーが低い場合、圧縮が機能します。180バイトのランダムデータを圧縮してみてください。圧縮されたサイズは、テストケースの最良のものよりもさらに大きくなります。バイナリのものを前に付けるということは、コンプレッサーがバイナリデータとテキストを同時に処理する必要があることを意味します。テキストではまったく発生しない新しいバイト値が導入されました。これにより、ファイルのエントロピーが増加します。
  2. すべての圧縮には弱い点と強い点があります(完全な「コルモゴロフ」圧縮を除く)。実装の詳細が原因で異常が発生している可能性があります。結局、違いは大きくありません。
于 2013-01-15T13:17:55.733 に答える