Java对一个字符串进行编码/解码

时间:2013-10-26 01:51:10

标签: java string algorithm encoding hash

我有一个字符串,我想用Java编写一个长字符串;我还希望将它从长时间解码为String。重要的是它是一个长期的" (原始)而不是Long(对象)。字符串的最大长度为128个字符,但通常要小得多。字符串的字符以ASCII编码,仅使用标准ASCII值(0-127)而不是扩展ASCII代码(0-256)。

我能够通过将每个char转换为long(8字节)的每个字节来编码长度为8的String。由于每个字符的范围是0-127(7位),我相信我最多可以编码9个字符(64位/ 7位= 9.14),但我还没有实现它。

我觉得这可能是不可能的(编码所有128个字符),但我想打开问题,看看是否有更好的技术。

如果不可能有128个字符,那么你可以编码成长字的最大字符数是多少?

P.S。我也考虑了哈希,但似乎它在问题的解码要求上失败了。

2 个答案:

答案 0 :(得分:0)

我相信Shannon's source coding theorem可以用来确定可以将多少数据压缩成64位。

您需要达到14:1的压缩率,但这很大程度上取决于您的数据集。例如,如果输入字符串恰好是重复128次的单个字符,则可以将896位(128个字符)压缩为64位。我怀疑对于所有 128个字符的字符串来说,实现这种压缩比是不可能的。

看看一个有点相关的问题:What is the maximum compression ratio of gzip?

另外,你可能会在cs.stackexchange.com得到更好的答案,因为这更像是一个理论问题,而不是一个编程问题。

答案 1 :(得分:0)

如果没有压缩,您可以在64位长的字符中以5位代表12个字符。这为你的编码提供了32个可能的代码点26代表alpha,剩下6个代码。对于7位ASCII,您只能容纳9个字符。

一般不可能在64位中执行128个字符(具体情况可能是压缩),如果将编码限制为2个代码点并将其表示为位,则64位时最好可以表示64个字符。

压缩可能能够为某些字符串提取它,但通常不能用于所有可能的128个字符的字符串。