2010-02-20 82 views
0

我對安全性或任何此類性質並不感興趣,但我需要一些允許「壓縮」/「解壓縮」字符串的函數。我已經嘗試過Base64,但是這對字符串的大小有很大的影響,它使得它更長。我也知道這個霍夫曼的東西,但這不起作用,因爲它也使它更長(在內存方面,它是一個整數)。ASCII文本字符串縮短

換句話說,我想要一些任意字符串'djshdjkash'被編碼爲其他字符串'dhaldhnctu'。能夠從一個到另一個,並且使新字符串的長度等於或小於原始字符串。

這是可能與JavaScript,它已經完成?

  • 需要澄清,正如我所說的安全不是目的,只是爲了掩飾字符串並保持其長度(或縮短它)。 Base64是最好的例子,但它使字符串更長。 ROT13是整潔的,但不包括所有的ASCII字符,只包括字母。
+0

你把'encode'放在引號中,請說明你是否真的想隱藏某些東西,如果不是,請說明你是什麼嘗試克完成。 – bmargulies 2010-02-20 23:55:23

+1

您可以將兩個ASCII字符打包成一個UTF-16字符。 – Gumbo 2010-02-21 00:11:12

回答

1
+1

投了你,但聽起來像他想要ROT47:http://en.wikipedia.org/wiki/ROT13#Variants – 2010-02-21 00:11:19

+1

在這種情況下,你可以做的經典:加1到每個字節。 您也可以將整個字符串旋轉半個字節。 – 2010-02-21 00:29:55

2

您需要壓縮,而不是編碼。編碼通常會添加比特。 Google「字符串壓縮算法」。

+2

另請注意,如果輸入較短(例如'djshdjkash'),則大多數任意輸入壓縮算法都會產生較大的輸出。只有當你通過一個門檻的長度,你開始看到壓縮勝利。 – 2010-02-21 00:07:01

+0

我應該提到這一點。示例字符串不能很好地壓縮在互聯網上找到的大多數通用算法。 – 2010-02-21 00:34:07

1

由於ROT13因爲它隻影響阿爾法,所以不只是在更大的字符集上實現一些東西。設置包含整個可打印字符集的from字符數組和包含相同字符的to數組,其排列順序不同。

然後對於字符串中的每個字符,如果它位於from陣列中,請將其替換爲to陣列中的等效位置。

這完全不產生壓縮,但會滿足您的所有要求(更短或相同的長度,變相的字符串)。

在僞代碼,類似:

chfrom = "ABCDEF..." 
chto = "1$#zX^..." 
def encode(s1): 
    s2 = "" 
    foreach ch in s1: 
     idx = chfrom.find(ch) 
     if idx == -1: 
      s2 += ch 
     else: 
      s2 += chto[idx] 
    return s2 
def decode(s1): 
    # same as encode but swap chfrom and chto. 
1

我不知道究竟要什麼壓縮。如果它是字符串的長度(如String.length()所示,可以將兩個ASCII字符壓縮爲一個Unicode字符,因此像hello, world這樣的字符串(12個字符)可能導致\u6865\u6c6c\u6f2c\u206f\u6f72\u6c64(6個字符)。但是您必須非常小心你不會生成像\uFFFF這樣的無效字符,並且你總是可以從壓縮的字符串返回到未壓縮的字符串。

另一方面,如果你想減少字符串的長度,這種方式是完全錯誤,所以請澄清你想在什麼情況下壓縮字符串