Я хочу объединить два или более потоков GZIP без их повторного сжатия.
Я имею в виду, что у меня A сжато до A.gz и B до B.gz, я хочу сжать их до одного gzip (A + B) .gz без повторного сжатия, используя C или C ++.
Несколько заметок:
- Даже если вы можете просто объединить два файла, и gunzip будет знать, как с ними обращаться, большинство программ не смогут работать с двумя кусками.
- Однажды я видел пример кода, который делает это просто путем распаковки файлов, а затем манипулируя оригиналом, и это значительно быстрее, чем обычное повторное сжатие, но все еще требует O (n) -процессорной работы.
- К сожалению, я не могу найти этот пример, который я нашел однажды (конкатенация с использованием только декомпрессии), если кто-то может указать на это, я был бы очень рад.
Примечание: он не является дубликатом этого , поскольку предлагаемое решение не соответствует моим потребностям.
Редактирование разъяснений :
Я хочу объединить несколько сжатых HTML-фрагментов и отправить их в браузер одной страницей в соответствии с запросом: "Accept-Encoding: gzip", с ответом "Content-Encoding: gzip"
Если поток объединяется так просто, как cat a.gz b.gz >ab.gz
, веб-движки Gecko (firefox) и KHTML получают только первую часть (a); В IE6 ничего не отображается, а в Google Chrome первая часть (а) отображается правильно, а вторая (б) - как мусор (вообще не распаковывается).
Только Опера справляется с этим хорошо.
Поэтому мне нужно создать один gzip поток из нескольких кусков и отправить их без повторного сжатия.
Обновление: Я обнаружил gzjoin.c в примерах zlib, он использует только декомпрессию. Проблема в том, что декомпрессия все еще медленнее их просто memcpy
.
Это все же быстрее в 4 раза, чем самое быстрое сжатие gzip. Но этого недостаточно.
Мне нужно найти данные, которые нужно сохранить вместе с файлом gzip, чтобы
не запускается процедура распаковки, и как мне найти эти данные во время сжатия.