如何检测c++中LZW算法压缩的字符串



我有两个xml文件,一个是LZW压缩的,另一个是纯文本。我如何知道是否压缩?

显然要做的事情当然是将字符串提供给LZW解压缩器,看看是否有错误和/或字符串的长度增加了大约200%。

除此之外,一个(格式良好的)LZW字符串或文件与魔法值0x1F 0x9D匹配。当然,也有可能LZW压缩字符串并且包含魔术值,但这是一个开始(非常容易检查)。

一个(格式良好的)XML文档应该以一个XML声明开始,必须以一个元素开始,只能选择性地在前面加空格。XML声明以字符串<?xml开头,元素标签必须以字母开头。
因此,如果您在遇到第一个<之前看到除空格之外的任何内容,或者后面的下一个字符不是?或字母(并且在遇到>之前只跟随字母和数字),则字符串不能是XML。由于知道字符串是XML或压缩的XML,因此必须对其进行压缩。对于有一点正则表达式练习的人来说,把它压缩成10-15个字符的模式可能很容易。

愚蠢的简单测试:第一个字符是<吗?

查找无效字符或无意义字符(如null字符)。如果它们存在,那么它就被压缩了。

如果不是,那么它要么是常规的XML,要么文件非常小(否则这是极不可能的)。

如果您想知道它是否被压缩,那么这将有助于您解压缩文件,并且您愿意使用库来完成繁重的工作:

使用压缩库总是尝试解压缩文件。让它决定文件是否被压缩。之后,将结果文件传递给xml库,并让该库决定是否具有有效和预期的xml文件。如果可能的话,不要重新创建公共库的功能,只需确保正确地处理库返回的信息。

最新更新