2015-01-21 3 views
0

У меня есть несколько блоков данных, сжатых с помощью zlib. Я хочу объединить эти блоки данных и сохранить их в одном файле.Могу ли я использовать заголовок zlib в качестве разделителя?

Очевидно, что я мог бы использовать что-то вроде JSON или XML, чтобы отделить блоки данных ZLIB, но мне интересно, если, чтобы сэкономить место, я могу просто искать следующую 78 01, 78 9C или 78 DA?

В принципе, мой вопрос в том, может ли теоретически эти сочетания байтов существовать в потоке данных zlib или я могу быть уверен, что когда я нахожу одну из этих комбинаций байт, запускается новый блок данных zlib, а конец в найденном месте минус один?

Я знаю, что несжатые блоки данных всегда имеют длину 1024 байта или меньше, поэтому сжатый поток никогда не будет> 1024 байта.

ответ

1

Нет, вы не можете. Любая последовательность байтов может отображаться в сжатых данных. В любой позиции байта существует вероятность того, что 1/1024 найдет правильный заголовок zlib. Итак, вы найдете лот действительных заголовков zlib в длинном сжатом потоке, которые на самом деле не являются заголовками zlib.

Вы можете создать собственную схему заполнения байтов, которая обертывает произвольные данные, включая потоки zlib или что-то еще, что гарантирует, что определенные последовательности не могут произойти, если они действительно не являются разделителями. Такие схемы могут повлечь за собой сколь угодно малое расширение данных. Например, если вы находите три 0xff в строке в данных, тогда вставьте 0x00 байт. Тогда 0xff 0xff 0xff 0xff может быть разделителем, так как он никогда не появится в данных. Это приведет лишь к увеличению потока в среднем примерно на 0,000006%.

Смежные вопросы