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