字节数组操作

时间:2012-09-23 12:40:06

标签: java compression bytearray

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

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

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

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

提前致谢

4 个答案:

答案 0 :(得分:1)

您的问题(如果是后期修改):

  

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

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

    数组包含非常随机的数据,这使得这个问题非常严重   难以破解。

答案: 鉴于您有一个30字节的数组,其中包含“随机”数据。无法将其压缩为只有16个字符的数字和拉丁字母。

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

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

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

答案 1 :(得分:1)

真正的随机数据将使用尽可能多的字节来编码为解码(如果不是更多)。

压缩数据时,可以利用数据中固有的非随机结构来制作更随机但更小的内容。这就是压缩已压缩数据非常困难的原因。

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

除非您的数据没有固有的可压缩性,否则您无法使用无损压缩(这是可逆的)如果有损压缩是一种选择,您仍然需要假设哪些信息可能丢失。


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

我认为,鉴于您的限制,这是您最好的选择。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

相关问题