2010-11-25 17 views
0

私は文字列圧縮のためにインターネット上に次のコードを作成しました。単純な文字列を圧縮すると、戻り値は非常に異なります。文字列としての文字列圧縮結果

例えば、圧縮( "ABC")を返します "AwAAAB + LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee ++ 997o7nU4n99 // P1xmZAFs9s5K2smeIYCqyB8/fnwfPyKyyfT/AcJBJDUDAAAA"

私は、単純な文字列の結果を取ることができます。使用している

おかげ

using System.IO.Compression; 
using System.Text; 
using System.IO; 

public static string Compress(string text) 
{ 
byte[] buffer = Encoding.UTF8.GetBytes(text); 
MemoryStream ms = new MemoryStream(); 
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) 
{ 
zip.Write(buffer, 0, buffer.Length); 
} 

ms.Position = 0; 
MemoryStream outStream = new MemoryStream(); 

byte[] compressed = new byte[ms.Length]; 
ms.Read(compressed, 0, compressed.Length); 

byte[] gzBuffer = new byte[compressed.Length + 4]; 
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length); 
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4); 
return Convert.ToBase64String (gzBuffer); 
} 
+3

あなたの質問がありますか? – LukeH

答えて

0

コードを圧縮本当に大きな文字列を対象としています。 GZip圧縮アルゴリズムを使用してソース文字列を圧縮し、次にBASE64エンコーディングを使用して読み取り可能にするか、または使用可能にするかを指定します。

拡大元文字列〜最大1.33倍(8ビットシンボルは6ビット+2ビットオーバフローとして次のシンボルにエンコードされます)。したがって、センス文字列を作成するには、ソースの長さから少なくとも70%圧縮する必要があります。

そのエンコードを使用すると、結果は期待され、通常通りです。

あなたの質問に答えるために、結果がBASE64であるため、(あなたのコードの最後の行を参照)、あなたは「単純な文字列結果」

+0

たとえば、この "3F2504E0-4F89-11D3-9A0C-0305E82C3301"のようなGuidの値を圧縮すると、期待される戻り値は "7QDBkvCA1 + B9K/U0vrQx1A--"になります。しかし、compressメソッドは "H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1 + B0oQiAYBMk2JBAEOzBiM3mkuwda ..."を返します。 "7QDBkvCA1 + B9K/U0vrQx1A--"の値はどのように取れますか? – user517601

+0

これはなぜ期待したのですか? GZipで圧縮すると、圧縮で使用されるZipヘッダーと辞書が結果に含まれます。したがって、ベースデータを、特に短くすることができます。 –

+0

おそらく 'Convert.ToBase64String(guid.ToByteArray())'が必要ですか?しかし、必要ならば、エンコードせずに元の文字列のguidを渡すだけで済みます。 –

0

わからによって何を意味するかを定義してください。

0

圧縮は常にいくつかの理由のために小さい出力にはなりません。

  1. 入力が "最も圧縮は何を圧縮しないであろう、その場合には、完全にランダムであるが、それでも解凍を保存する必要があります指示 "に従う。そのようなデータを圧縮した結果は、データ+命令...より大きくなります。
  2. 入力に使用された圧縮アルゴリズムで検索された機能がありません。これは、使用している圧縮アルゴリズム(あなたのケースではGzip)に依存することを除いて、前のものと非常に似ています。
  3. 非常に小さい入力。入力が小さければ小さいほど、圧縮可能なセグメントを見つける機会が少なくなるので、擬似ランダム入力(ランダムではありませんが、それほど小さくはありません)を得る大きなチャンスがあります。最初のケースに戻ります。

Base64はここで大きなポイントですが、一般的に圧縮についてのこれらの小さな事実を忘れないでください。

関連する問題