【问题标题】:Deflater makes (encrypted) byte[] biggerDeflater 使(加密的)字节 [] 更大
【发布时间】:2015-04-17 21:14:40
【问题描述】:

我有一个大约 9 百万字节的 byte[],我想将它存储到一个文件中。我想使用 Deflater 来压缩数组,但似乎这个过程只会使数组(稍微)变大。我的数据不可压缩吗?如果是这样,为什么?还有其他方法可以使数组更小吗?

我的代码:

    ByteArrayOutputStream baos = null;
    Deflater dfl = new Deflater();
    dfl.setLevel(Deflater.BEST_COMPRESSION);
    dfl.setInput(data);
    dfl.finish();
    baos = new ByteArrayOutputStream();
    byte[] tmp = new byte[1024];
    try{
        while(!dfl.finished()){
            int size = dfl.deflate(tmp);
            baos.write(tmp, 0, size);
        }
    } catch (Exception ex){

    } finally {
        try{
            if(baos != null) baos.close();
        } catch(Exception ex){}
    }

    Log.d(TAG, data.length + " " + baos.toByteArray().length);
    return baos.toByteArray();

编辑:

我将图像从磁盘转换为字节数组。然后我加密了它。现在我想将该(加密的)字节 [] 存储在一个文件中,以便稍后我可以读取它并解密它,从而重新创建图像。原图是~0.6MB,加密后的文件是~9MB..为了用户,我想避免这么大的差异..

【问题讨论】:

  • "我的数据不可压缩吗?"它是什么样的数据?你能描述一下它的“模式”吗?

标签: java android compression


【解决方案1】:

加密数据应该表现得像随机噪声。随机噪声是不可压缩的。 建议先压缩,再加密。

现在,如果图像是压缩格式(例如 jpeg),进一步压缩它可能没有帮助。

【讨论】:

  • 是的,原图是jpg。我理解为什么文件这么大,因为我真的得到了宽度 * 高度 * 4 字节,所以大字节 []。所以这里没有希望减少文件吗? :(
  • 所以这不是您要存储的实际 jpeg 数据,而是从图像中获取每个像素并将其存储为 4 个字节?这是一个奇怪的策略。我只是加密原始 jpeg 数据并完成它。如果你还想走你的路,好消息是你专有的 4-bytes-per-pixel 格式是未压缩的,所以只要你先压缩然后加密,你应该可以释放几个字节。跨度>
  • 我选择这种方式确实没有什么特别的原因。加密函数需要一个字节数组,所以我只做了 bitmap.copyPixelsToBuffer(buf) 然后 buff.array()。你是说我可以在某个地方走捷径?
  • 如果path是文件系统中jpeg文件的路径,可以通过new FileInputStream(path)获取数据,从那里获取字节数组。看这里:stackoverflow.com/questions/2436385/…
  • 你是金子!加密的 byte[] 现在约为 60KB!谢谢!我将其存储为 .png 文件,然后将其读回并解密并取回我的图像。当我从画廊打开加密的 png 时,我只看到一张颜色的图片,但我想我对此无能为力。
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 2020-06-11
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多