2011-02-07 268 views
-1

如何在C#中壓縮長字符串時獲取短字符串。如何在壓縮/解壓縮字符串後獲取短字符串?

我想壓縮一個很長的字符串成一個短的字符串(最小長度),也想解壓縮回來我的原始字符串。最小長度表示如果原始字符串長度爲10,則壓縮字符串長度必須是原始字符串的一半或更少。

我不想使用庫中構建的.Net以外的任何庫。

For example: Original String: "Hello World" 
Compressed String: "$n(@3" //something like this. 

我用不同的方法,但他們並不在此manner.Any幫助壓縮? 在此先感謝。

+1

那麼,你想要什麼語言的答案?您發佈了3種語言和一個平臺。另外,你的問題定義對於給出的有用答案太模糊了(例如 - 「最小長度」 - 最小長度)? – Oded 2011-02-07 13:51:15

+0

任何像C++,C#.Net和VB.Net.I語言都可以將它轉換成我的C#。使用最小長度表示如果原始字符串長度爲10,則壓縮字符串長度必須是原始的一半或更少。 – mirfan00 2011-02-07 13:53:23

+0

很可能你會在這樣一個壓縮的字符串中得到不可打印的字符,甚至非unicode符號。你究竟想要在這裏解決什麼問題,爲什麼你需要將它們壓縮成新的*字符串*? – 2011-02-07 13:55:54

回答

3

使用GZipStream這是自2.0以來的.NET。

private static string CompressLongString(string longString) 
{ 
    MemoryStream outstream = new MemoryStream(); 
    MemoryStream instream = new MemoryStream(Encoding.UTF8.GetBytes(longString)); 

    using (GZipStream compress = 
     new GZipStream(outstream, 
     CompressionMode.Compress)) 
    { 
     instream.CopyTo(compress); 

    } 

    return Encoding.Unicode.GetString(outstream.GetBuffer()); 
} 
-4

我建議魔法。一個字符串只是一系列的數字,其中沒有一個可以被丟棄,並保持字符串相同。因此,要壓縮字符串,您需要確定是否有任何字符串可供您使用,並制定規則來執行此操作。我想不出任何常見的方式,所以你必須制定自己的規則。

1

你的真實伴侶是什麼?如果要通過壓縮很長的字符串來節省內存,則可以使用UTF-8將其轉換爲byte[]數組。創建一個MemoryStream對象,然後在該MemoryStream上以UTF-8創建StreamWriter,然後將字符串寫入該對象。然後關閉Streamwriter和Stream並使用ToArray()將其轉換爲緊湊陣列。雖然這會創建很多臨時對象,但結果數組通常會比原始字符串小得多。

請注意,這不是壓縮,只是將字符編碼爲UTF-8,通常比字符串中常用的UTF-16小50%。按照您的要求,它使用標準.NET庫完成。 (但結果不是字面上的字符串,因爲你想。)

0

從您的意見我明白你想保存數據庫的大小。

壓縮10個字符的字符串,並不會讓你感到非常滿意。並沒有保證贏得一定的比例(你不能壓縮已經壓縮的字符串)。

您可以將每個字符串存儲在一個表中(使用字符串和數字主鍵),並使用其他表中的鍵引用該字符串。如果你有重複的字符串。如果你的字符串不重複,你可能會將每個字符串分解成單詞,並存儲這些單詞的索引。