3

我有一个 ~30 长度的字节数组。
我正在寻找一种方法将此数据传递给具有以下要求的多个用户:

1. 它必须很短.. 最多大约 16 个字符。
2. 只接受可打印的字符(只有数字或只有字母会更好)。
3.它必须是可打印的输出(保存到文件或使用套接字不是我想要的)。
4.(感谢 Tudor)我希望能够将其解码回原始数组

数组包含相当随机的数据,这使得这个问题很难破解。
我尝试了许多压缩方法,但到目前为止都没有运气。
压缩后,我可能会将数据编码为 64 进制以使输出尽可能短(除非有更好的方法)

该项目基本上是在java中,但如果有其他语言的解决方案,我很乐意在这里讨论它。

提前致谢

4

4 回答 4

1

您的问题(以防以后编辑):

我有一个 ~30 长度的字节数组。我正在寻找一种方法将此数据传递给具有以下要求的多个用户:

  1. 它必须很短..最多大约 16 个字符。
  2. 只有可打印的字符是可接受的(只有数字或只有字母会更好)。
  3. 它必须是可打印的输出(保存到文件或使用套接字不是我想要的)。

数组包含相当随机的数据,这使得这个问题很难破解。

答:假设您有一个 30 字节的数组,其中包含“随机”数据。无法将其压缩为仅由数字和拉丁字母组成的 16 个字符。

与 16 个拉丁字符相比,30 个字节的信息太多了。

但是,您可以做的是使用更大的字母表,例如 unicode 的所有可打印字符。我不知道到底有多少个字符。但甚至有一些代码点(和代码点序列)具有相同的视觉呈现。您只需要总共 256*256 = 65536 个不同的外观字符。这样,您可以将两个字节编码为一个字符,并在 16 个字母的字符串中存储多达 32 个字节。

但是请注意,该技术不涉及压缩,它只是相同原始数据的不同编码。随机数据不可压缩。

于 2012-09-23T12:57:36.630 回答
1

真正的随机数据将使用与解码一样多的字节进行编码(如果不是更多)。

当你压缩数据时,你利用数据中固有的非随机结构来制作更随机但更小的东西。这就是为什么压缩已经压缩的数据非常困难的原因。

在您的情况下,您似乎想要将 30 * 8 位或 240 位编码为 16 * 6 位或 96 位。这意味着您的数据不能非常随机地压缩至少 2.5 次。每次都压缩这么多是非常困难的,而且你总是有可能你的压缩字符串会比你开始时更大。您所能做的就是使这种情况不太可能发生。

除非您的数据不具有固有的可压缩性,否则您不能使用无损压缩(这是可逆的) 如果有损压缩是一种选择,您仍然必须对可能丢失的信息做出假设。


如果您需要将代码与某些信息匹配,您可以做的是生成一个随机唯一代码并将其用作某个数据库的密钥。使用这种方法的好处是密钥可以任意短,前提是您永远不需要比您生成的更多的唯一密钥,并且您也可以将尽可能多的信息与密钥关联起来。

鉴于您的限制,我相信这是您的最佳选择。

于 2012-09-23T14:21:20.803 回答
0

对不起,我真的不能很好地理解你的问题。您有 30 个二进制字节,并且您想将它们编码为长度小于 16 字节的可打印字符串?如果是的话,我只想说这是不可能的......但也许我只是不明白这个问题......

如果这 30 个字节可以包含所有 255 个可能的值,那么在所有可能的情况下都无法将它们压缩到 16 个字节。那不是Java问题,只是数学问题。相反,如果您的字节只能具有值的子集,那么也许您可以做一些事情,具体取决于子集需要多少位。要从 30 个字节减少到 16 个字节,如果您希望将随机的字节序列存储在数组中,则每个字节最多可以处理 4 位,这意味着 16 个字符的子集。

于 2012-09-23T12:45:13.093 回答
0

我确实相信一个字符是 1 个或 2 个字节,这意味着:16 个字符 = 16-32 个字节。一种解决方案可能是定义自己的字母表,如果您可以将字符限制为仅按字母顺序排列,则每个字节只需要 5 位(26 个字母),因此每 5 个字节可以存储 8 个字母。将您的字符转换为您自己的规范,当您解码时,您只需每 5 位拆分一次。

于 2012-09-23T13:00:48.773 回答