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

Java 如何找出固件中嵌入的GZIP部分的大小?,java,size,gzip,compression,Java,Size,Gzip,Compression,我目前正在分析包含许多不同部分的固件映像,其中一个是GZIP部分 我能够使用幻数和Java中的GZIPInputStream知道GZIP部分开始的位置 但是,我需要知道gzip部分的压缩大小gzip输入流将返回未压缩的文件大小 有人有主意吗 您可以使用自定义InputStream计算读取的字节数。您需要强制流一次读取一个字节,以确保读取的内容不会超过您的需要 您可以将当前的InputStream包装在该文件中 class CountingInputStream extends InputStr

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

我能够使用幻数和Java中的
GZIPInputStream
知道GZIP部分开始的位置

但是,我需要知道gzip部分的压缩大小
gzip输入流
将返回未压缩的文件大小


有人有主意吗

您可以使用自定义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;

一般来说,除了遍历所有块之外,没有简单的方法来判断gzip数据的大小


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

@Peter Lawrey:你能建议一种创建此自定义输入流的方法吗?目前,我只使用GZIPInputStream,它足够聪明,可以知道GZIP部分何时结束。对不起,一次读取一个字节会不会增加文件IO的数量,从而导致程序对大文件运行缓慢?谢谢你的解决方案,顺便说一句,我要试试now@8to5,您正在从固件读取压缩数据,这是非常高级的IMHO。我假设您可以计算read()的调用次数。;)@8到5,如果您不使用BufferedInputStream,则会发生这种情况哈哈。。不幸的是,目前有些东西对我来说太先进了。谢谢你的帮助。如果我能让它工作,请告诉我