2010-02-20 60 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这样的无效字符,并且你总是可以从压缩的字符串返回到未压缩的字符串。

另一方面,如果你想减少字符串的长度,这种方式是完全错误,所以请澄清你想在什么情况下压缩字符串