1

我有一个字符串,我想用 Java 将它编码为 long;我也想把它从一个很长的回解码成一个字符串。重要的是它是“长”(原始)而不是长(对象)。字符串的最大长度为 128 个字符,但通常要小得多。字符串的字符以 ASCII 编码,并且仅使用标准 ASCII 值 (0-127) 而不是扩展的 ASCII 代码 (0-256)。

我只需将每个 char 转换为 long (8 个字节)的每个字节,就可以对长度为 8 的字符串进行编码。由于每个字符的范围是 0-127(7 位),我相信我最多可以对 9 个长字符(64 位 / 7 位 = 9.14)进行编码,但我还没有实现它。

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

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

PS我也研究了一下散列,但似乎它在问题的解码要求上失败了。

4

2 回答 2

0

我相信香农的源编码定理可以用来确定有多少数据可以压缩成 64 位。

您需要实现 14:1 的压缩比,这是可能的,但它高度依赖于您的数据集。例如,如果您的输入字符串恰好是重复 128 次的单个字符,您可以将 896 位(128 个字符)压缩为 64 位。我怀疑对所有128 个字符的字符串都实现这种压缩率是不可能的。

看一个有点相关的问题:gzip的最大压缩比是多少?.

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

于 2013-10-26T02:42:21.353 回答
0

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

一般来说,在 64 位中执行 128 个字符是不可能的(特定情况下可能会使用压缩),如果您将编码限制为 2 个代码点并将它们表示为位,则最好使用 64 位来表示 64 个字符。

对于某些字符串,压缩可能能够将其拉出,但通常不适用于所有可能的 128 个字符的字符串。

于 2013-10-26T02:49:48.010 回答