Как узнать размер встроенного в прошивку раздела GZIP? - PullRequest
0 голосов
/ 11 мая 2011

В настоящее время я анализирую образы прошивок, которые содержат много разных разделов, один из которых - раздел GZIP.

Я могу узнать местоположение начала раздела GZIP, используя магическое число и GZIPInputStream в Java.

Однако мне нужно знать размер сжатого раздела gzip.GZIPInputStream вернул бы мне несжатый размер файла.

Есть кто-нибудь, у кого есть идея?

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Вы можете посчитать количество прочитанных байтов, используя пользовательский 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;
0 голосов
/ 11 мая 2011

В общем, нет простого способа определить размер сжатых данных, кроме как просто пройти через все блоки.

gzip - это формат сжатия потока, означающий, что все сжатые данные записываютсяв один проход.Спрятать сжатый размер нельзя нигде - его не может быть в заголовке, поскольку для этого потребуется более одного прохода, и бесполезно иметь его в трейлере, поскольку, если вы можете найти трейлер, тоВы уже знаете сжатый размер.

...