のは、次の文字列を考えてみましょう:
"XXXXYYYYXXXXYYYY"
- Aランレングス符号化アルゴリズムは言うだろう:を「それは4だ 'X'、4 'Y' に続いて、4 'のX' が続きます"0XXXYYY"という文字列が続き、同じ文字列が続きます.2番目の文字列を1番目の文字列への参照に置き換えましょう。 "
- ハフマンコーディングアルゴリズムは次のようになります。"その文字列には2つのシンボルしかないので、シンボルあたり1ビットしか使用できません。"
ここで、私たちの文字列をBase64でエンコードしましょう。ここでは、何を得るのです。
"WFhYWFlZWVlYWFhYWVlZWQ=="
すべてのアルゴリズムが今言っている:「つまり混乱のどのような?」。そして、彼らはその弦を非常にうまく圧縮しないでしょう。各出力
Input bytes : aaaaaaaa bbbbbbbb cccccccc
6-bit repacking: 00aaaaaa 00aabbbb 00bbbbcc 00cccccc
:リマインダーとして
、Base64では、基本的に(0 ... 63)の4バイトのグループに(0 ... 255)で3バイトの再エンコード基により動作しますバイトは印刷可能なASCII文字に変換されます。慣例により、これらの文字は(ここではマークの付いたすべての10文字)です。
0 1 2 3 4 5 6
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/
たとえば、上の例の文字列が16進数で0x58に等しい3バイトのグループ(文字「X」のASCIIコード)で始まります。またはバイナリに:01011000.のは、Base64エンコードを適用してみましょう:私たちがきたので
Input bytes : 0x58 0x58 0x58
As binary : 01011000 01011000 01011000
6-bit repacking : 00010110 00000101 00100001 00011000
As decimal : 22 5 33 24
Base64 characters: 'W' 'F' 'h' 'Y'
Output bytes : 0x57 0x46 0x68 0x59
は基本的には、元のデータストリームには明らかだったパターン「3回のバイト0x58は」符号化されたデータストリームにはもはや明白ではありませんバイトを6ビットのパケットに分割し、それらを現在ランダムであるように見える新しいバイトにマッピングしました。
つまり、ほとんどの圧縮アルゴリズムが依存する元のバイト配列が壊れています。
どのような圧縮方法を使用しても、通常はアルゴリズムのパフォーマンスに重大な影響を与えます。そのため、常に最初に圧縮し、2番目にエンコードする必要があります。
これは、さらに暗号化に当てはまります。まず圧縮し、2番目を暗号化します。
EDIT - XZが使用している - - ビットストリームではなく、バイトストリームに取り組んでいるMSaltersは、LZMAは気づいたようLZMA
に関する注意。
それでも、このアルゴリズムはまた、私の以前の説明と基本的に一致しているように、Base64エンコーディングに苦しむだろう。
Input bytes : 0x58 0x58 0x58
As binary : 01011000 01011000 01011000
(see above for the details of Base64 encoding)
Output bytes : 0x57 0x46 0x68 0x59
As binary : 01010111 01000110 01101000 01011001
でもビットレベルで働くことによって、それは内のパターンを認識する方がはるかに簡単です入力バイナリシーケンスよりも出力バイナリシーケンスのほうが大きい。
"_base64-then-compress_は_compress-then-base64_よりも大幅に悪く、遅くなります。"という2つの意味は無関係です。 – MSalters