2014-09-03 51 views
0

这是我在Android的压缩使用deflater数据代码如何计算字节大小deflater压缩输出的Android

String inputString = "kjhdf948w37fh4ifh34789fh34789fh3489fh7348fh84f8h4f3"; 
    byte[] input = inputString.getBytes("UTF-8"); 

    // Compress the bytes 
    byte[] output = new byte[100]; 
    Deflater compresser = new Deflater(Deflater.BEST_COMPRESSION); 
    compresser.setInput(input); 
    compresser.finish(); 
    int compressedDataLength = compresser.deflate(output); 

现在我想修复“输出”字节数组的大小,我该怎么设置输出字节数组的大小。请帮我从这个问题出来。

byte[] output = new byte[100]; 

当前我设置了100我如何根据输入字节动态计算输出字节数组大小。

+0

简单地说,你不能...做一些像'class TheData { public lenghtOfThisStructureInBytes;/* 4 + 4 +压缩数组长度*/public int lenghtOfTheDataBeforeCompression; byte [] theDataAfterCompression; }(我的假设是你wana把这个字节数组发送到某处 - 所以发送纯字节数组发送这个结构...现在fx:如果你使用套接字,你可以读取4个字节将它们转换为int(len),然后读取len - 4)字节,你会得到结构 – Selvin 2014-09-03 11:16:57

回答

1

这是从dev guide

byte[] originalBytes = ... 

Deflater deflater = new Deflater(); 
deflater.setInput(originalBytes); 
deflater.finish(); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] buf = new byte[8192]; 
while (!deflater.finished()) { 
    int byteCount = deflater.deflate(buf); 
    baos.write(buf, 0, byteCount); 
} 
deflater.end(); 

byte[] compressedBytes = baos.toByteArray(); 

,我认为关键是设置合理的buf尺寸小, 所以你会收集你的压缩字节ByteArrayOutputStream,然后你得到压缩字节数组,一旦while循环结束与正确的数据长度

1

这里是平减物价指数的文档,示例代码这不正是你可能需要:

Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION); 
deflater.setInput(originalBytes); 
deflater.finish(); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
byte[] buf = new byte[8192]; 
while (!deflater.finished()) { 
    int byteCount = deflater.deflate(buf); 
    baos.write(buf, 0, byteCount); 
} 
deflater.end(); 

byte[] compressedBytes = baos.toByteArray(); 

由于输出的大小是事先未知的,缓冲区分配8K字节(在你的情况下,可能更少),并且有一个循环读取字节并将它们发送到ByteArrayOutputStream,直到读取完所有字节。

最后你得到所有

byte[] compressedBytes = baos.toByteArray(); 

更简单的方法压缩输出可以使用DeflaterOutputStream

try { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION); 
    deflater.setInput(originalBytes); 
    DeflaterOutputStream dfos = new DeflaterOutputStream(baos, deflater); 
    dfos.deflate(); 
    dfos.close(); 
    byte[] compressedBytes = baos.toByteArray(); 
} catch (IOException ex) { 
    ex.printStrackTrace(); 
} 
相关问题