2011-04-22 88 views
1

這聽起來愚蠢的,但我不知道都一樣......將字符串壓縮爲更小的字符串?

是否有可能採取一個給定的字符集組成的字符串,並使用更大的字符集,或撰寫成一個壓縮它然後把它轉換回來?

例如,如果你有一個字符串,你知道什麼是由[a-z][A-Z][0-9]-_+=組成,你可以把它變成一個數字,交換使用更多的字符爲了壓縮它?

這是一個我不熟悉的領域,我仍然想保持它作爲一個字符串,只是一個較短的一個。 (用於顯示/回顯/等,而不是內存)

+0

我不完全清楚你所說的「壓縮」是什麼意思。你是否希望它在內存中佔用較少的物理空間,或者顯示的視覺空間較少?如果前者,任何類型的壓縮庫將工作,我想象。如果後者,像base64編碼的東西可能? – David 2011-04-22 17:20:55

+0

任何體面的壓縮算法都會以更高效的方式進行更多的操作(例如,哈夫曼編碼爲較頻繁的字符分配較短的代碼)。他們中的許多人(再次,哈夫曼編碼是一個很好的例子)相對簡單。但即使這些幾乎都不值得。你處理了多少數據?在理論上, – delnan 2011-04-22 17:22:09

+0

一個比100個字符短的字符串;內存/等不是我所擔心的,但實際的字符長度使用相同的編碼(UTF-8,或任何適當的術語)......目前這主要是學術,但我可以看到一些實際的使用,如果這個工程。我對這個主題不太瞭解。 – 2011-04-22 17:25:02

回答

-1

字符串壓縮它是一種最原始的,你不可能通過轉換,除非你使用Java的拉鍊庫,甚至不會產生你可能尋求的性能優勢奪回任何空間。

+0

我實際上並沒有試圖得到性能提升,這是因爲我試圖在遊戲中將〜50個角色擠成一個具有描述值的(縮短長篇故事)項目,以便它適合;這個想法是將消息隱藏在轉換後的字符串中,而不是創建散列或其他東西,並將實際字符串隱藏爲該項目上的數據。這樣,玩家就可以將字符串複製並與其他人分享。 (遊戲外或通過其他媒體) – 2011-04-22 17:49:53

+0

String **不是Java中的原始類型。 – Andremoniy 2014-10-17 08:06:40

2

的字符串在內部保存的16個字符,這對於西歐語言是一種浪費,你可以轉換爲UTF-8的陣列應該做

String myString = ..... 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
baos.write(myString.getBytes("UTF-8"); 
byte[] data = baos.toByteArray(); 

給你減少50%,並保持到它作爲一個字節數組。

當然,如果你真的想用它們作爲字符串,這是相當不方便的,但如果要點是長期存儲,沒有太多訪問權限,這將爲你節省一大筆錢。

你將不得不做相反的事重新創建一個字符串。