Java 字节数组操作

Java 字节数组操作,java,compression,bytearray,Java,Compression,Bytearray,我有一个长度约为30字节的数组。 我正在寻找一种方法,将此数据传递给具有以下要求的多个用户: 1.它必须是短的。。最多16个字符。 2.只接受可打印字符(只有数字或字母更好)。 3.它必须是一个可打印的输出(保存到文件或使用套接字不是我想要的)。 4.(多亏了都铎)我想把它解码回原始阵列 数组包含非常随机的数据,这使得这个问题很难解决。 我已经尝试了很多压缩方法,但到目前为止运气不好。 压缩后,我可能会将数据编码到64位,以使输出尽可能短(除非有更好的方法) 该项目基本上是用jav

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

1.它必须是短的。。最多16个字符。
2.只接受可打印字符(只有数字或字母更好)。
3.它必须是一个可打印的输出(保存到文件或使用套接字不是我想要的)。
4.(多亏了都铎)我想把它解码回原始阵列

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

该项目基本上是用java编写的,但如果有其他语言的解决方案,我很乐意在这里介绍一下


提前谢谢

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

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

您的问题(在以后编辑时):

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

  • 它必须是短的。。最多16个字符
  • 只接受可打印字符(只有数字或字母更好)
  • 它必须是一个可打印的输出(保存到文件或使用套接字不是我想要的)
  • 数组包含非常随机的数据,这使得这个问题非常严重 难以破解

    答复: 假设您有一个30字节的数组,其中包含“随机”数据。这是不可能压缩成只有16个字符的数字和拉丁字母

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

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

    然而,请注意,这项技术不涉及压缩,它只是对相同原始数据的不同编码。
    随机数据是不可压缩的。

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

    真正的随机数据将使用与解码相同的编码字节数(如果不是更多的话)

    压缩数据时,利用数据中固有的非随机结构来生成更随机但更小的内容。这就是为什么压缩已经压缩的数据非常困难的原因

    在您的情况下,您似乎希望将30*8位或240位编码为16*6位或96位。这意味着您的数据必须不是非常随机的,才能将其压缩至少2.5倍。每次压缩这么多都是非常困难的,而且压缩后的字符串可能会比开始时大。你所能做的就是让这不太可能

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


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


    考虑到您的限制条件,我相信这是您的最佳选择。

    因此,您有一个30字节的数组,您希望将其减少为16字节的字符数组?但是,您还希望能够将其解码回原来的右侧?当然可以。我忘了提这件事。。对不起,你为什么要这个?你想实现什么?我不明白,你能举一个简短的例子吗?当你得到你想要“压缩”的字符数组时,你把每个字母,通过一个方法运行它,这个方法在你的自定义位字母表中返回它的值(例如,a可以返回00001,B 00010,C 00011等等)。用户应该键入这个这就是为什么我只能使用可打印字符(以及为什么它必须尽可能短)。好的,那么使用unicode中的各种奇怪符号可能不是一个好主意,因为只有很少的符号易于键入。如果您知道您最多只有,比如说一百万个不同的代码,只需为每个代码指定一个序列号,然后将该数字打印给您的用户。或者,为您的用户提供传输的可能性g这个号码在他们的手机上。比如说可能有二维码吗?嘿,彼得,在男人之后