我目前正在分析包含许多不同部分的固件映像,其中一个部分是GZIP部分。
我能够使用幻数和Java中的GZIPInputStream
来了解GZIP部分的起始位置。
但是,我需要知道gzip部分的压缩大小。 GZIPInputStream
会返回未压缩的文件大小。
有没有人有想法?
答案 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是一种流压缩格式,这意味着所有压缩数据都是一次写入的。没有办法将压缩的大小存放在任何地方 - 它不能在标题中,因为这将需要多个传递,并且将它放在预告片上是没用的,因为如果你可以找到预告片,那么你已经知道了压缩的大小。