Скажем, Я понимаю, что к сжатым файлам нельзя случайным образом получить доступ, и если я сократил скажем, последние 5 МБ из него, затем данные сразу после того, как сокращение будет мусором - но gzip может повторно синхронизировать и декодировать отдых потока? Если я понимаю, что это правильно gzip поток является простой поток команд, описывающих, что произвести - должно быть возможно синхронизировать с этим. Затем существует раздвижное окно 32 КБ новых несжатых данных - который запускается как мусор, конечно, если бы мы запускаем в середине, но я предположил бы, что это обычно заполнять реальными данными быстро, и от той точки распаковка тривиальна (хорошо, возможно, что что-то перекопировано много раз от запуска файла в конец, и таким образом, раздвижное окно никогда не очищается - меня удивило бы, если бы это было все, что распространенный - и если это происходит, мы просто обрабатываем целый файл). Я не ужасно стремлюсь сделать эту семью gzip хакерства сам - разве кто-либо не сделал этого прежде для контакта с поврежденными файлами если ничто иное? Кроме того - если gzip действительно не может сделать этого, там, возможно, какие-либо другие потоковые программы сжатия, которые работают в значительной степени как он, кроме они позволяют повторно синхронизировать середину реки? Править: Я нашел чистое переопределение Ruby zlib и взломал его для печати возрастов байтов в раздвижном окне. Оказывается, что вещи действительно становятся скопированными много раз много и даже после 5 МБ +, раздвижное окно все еще содержит материал от первых 100 байтов, и от случайных мест всюду по файлу. Мы не можем даже обойти это путем чтения первых нескольких блоков и последних нескольких блоков, поскольку на те первые байты не ссылаются непосредственно, это - просто очень длинная цепочка копий и единственный способ узнать то, к чему это относится, путем обработки всего этого. По существу, с опциями по умолчанию, что я хотел, вероятно, невозможно. С другой стороны, zlib имеет file.txt.gz
имеет 2 ГБ, и я хочу видеть 100 строк в последний раз или около этого. zcat Z_FULL_FLUSH
опция, которая разрешает это раздвижное окно ради синхронизации. Таким образом, вопрос все еще стоит. Предположение, что zlib синхронизирует время от времени, является там какими-либо инструментами для чтения просто конца его, не обрабатывая все это?
Z_FULL_FLUSH испускает известную последовательность байтов (00 00 FF FF), которую вы можете использовать для синхронизации. Эта ссылка может быть полезна.
В этом разница между блочным и потоковым шифрами. Поскольку gzip является потоковым шифром, вам может понадобиться весь файл до определенного момента, чтобы расшифровать байты в этой точке.
Как вы упомянули, когда окно очищено, вы в полном порядке. Но нет никакой гарантии, что zlib действительно делает это достаточно часто для вас... Я предлагаю вам поискать в обратном направлении от конца файла и найти маркер для полной очистки.