Как обнаружить строку сжимается алгоритмом LZW в C++

У меня есть два XML-файла, один сжатый LZW, другой в виде простого текста. Как я могу узнать, сжато или нет?

4 ответа

Решение

Очевидная вещь, которую нужно сделать, это, конечно, подать строку в декомпрессор LZW и посмотреть, есть ли ошибка и / или длина строки увеличивается примерно на 200%.

Кроме этого, (правильно сформированная) строка или файл звезд LZW с магическим значением 0x1F 0x9D, Конечно, LZW может сжимать строку и не включать магическое значение, но это начало (очень легко проверить).

(Правильно сформированный) документ XML должен начинаться с объявления XML и начинаться с элемента, которому необязательно предшествует пробел. Объявления XML начинаются со строки <?xml и теги элементов должны начинаться с буквы.
Поэтому, если вы видите что-либо, кроме пробелов, прежде чем встретиться с первым < или если следующий следующий символ не ? или буква (и только буквы и цифры следуют до >), то строка не может быть XML. Поскольку вы знаете, что строка является XML или сжатым XML, она должна быть сжатой. Возможно, кому-то с небольшой практикой регулярных выражений будет достаточно легко втиснуть это в шаблон из 10-15 символов.

Глупый простой тест: первый персонаж <?

Ищите недопустимые или бессмысленные символы (например, нулевой символ). Если они существуют, то они сжаты.

Если нет, то это либо обычный XML, либо файл очень маленький (в противном случае это маловероятно).

Это поможет, если вы хотите знать, сжат ли он, поэтому вы можете распаковать файл и использовать библиотеки для тяжелой работы:

Используйте библиотеку сжатия, чтобы всегда пытаться распаковать файл. Пусть он решит, был ли файл сжат. После этого передайте полученный файл в библиотеку xml и дайте этой библиотеке решить, есть ли у вас действительный и ожидаемый файл XML. Если возможно, не воссоздайте функциональность общих библиотек, просто убедитесь, что вы правильно работаете с возвращенной информацией библиотек.

Другие вопросы по тегам