如何找出固件中嵌入的GZIP部分的大小?

时间:2011-05-11 07:31:03

标签: java size gzip compression

我目前正在分析包含许多不同部分的固件映像,其中一个部分是GZIP部分。

我能够使用幻数和Java中的GZIPInputStream来了解GZIP部分的起始位置。

但是,我需要知道gzip部分的压缩大小。 GZIPInputStream会返回未压缩的文件大小。

有没有人有想法?

2 个答案:

答案 0 :(得分:2)

您可以使用自定义InputStream计算读取的字节数。您需要强制流一次读取一个字节,以确保您读取的内容不超过您的需要。


您可以将当前的InputStream包装在此

class CountingInputStream extends InputStream {
    final InputStream is;
    int counter = 0;

    public CountingInputStream(InputStream is) {
        this.is = is;
    }

    public int read() throws IOException {
        int read = is.read();
        if (read >= 0) counter++;
        return read;
    }
}

然后将其包装在GZIPInputStream中。字段计数器将保持读取的字节数。

要在BufferedInputStream中使用它,您可以执行

 InputStream is = new BufferedInputStream(new FileInputStream(filename));
 // read some data or skip to where you want to start.

 CountingInputStream cis = new CountingInputStream(is);
 GZIPInputStream gzis = new GZIPInputStream(cis);
 // read some compressed data
 dis.read(...);

 int dataRead = cis.counter;

答案 1 :(得分:0)

一般来说,除了浏览所有块之外,没有简单的方法可以告诉gzip压缩数据的大小。

gzip是一种流压缩格式,这意味着所有压缩数据都是一次写入的。没有办法将压缩的大小存放在任何地方 - 它不能在标题中,因为这将需要多个传递,并且将它放在预告片上是没用的,因为如果你可以找到预告片,那么你已经知道了压缩的大小。