Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果不使用幻数,我怎么能说文件是SVG呢?_Python_Xml_Svg_File Format_Magic Numbers - Fatal编程技术网

Python 如果不使用幻数,我怎么能说文件是SVG呢?

Python 如果不使用幻数,我怎么能说文件是SVG呢?,python,xml,svg,file-format,magic-numbers,Python,Xml,Svg,File Format,Magic Numbers,SVG文件基本上是一个XML文件,因此我可以使用字符串您可以尝试以二进制形式读取文件的开头-如果您找不到任何神奇的数字,您可以将其作为文本文件读取,并匹配您想要的任何文本模式。反之亦然。XML不需要以开头,这是来自man file()的,对于unixfile命令: 魔法测试用于检查具有特定固定格式数据的文件。这方面的典型示例是一个二进制可执行文件。。。这些文件在文件开头附近的特定位置存储了一个“幻数”,它告诉UNIX操作系统该文件是二进制可执行文件,以及几种类型中的哪一种通过扩展将“魔术”的概念

SVG
文件基本上是一个
XML
文件,因此我可以使用字符串
您可以尝试以二进制形式读取文件的开头-如果您找不到任何神奇的数字,您可以将其作为文本文件读取,并匹配您想要的任何文本模式。反之亦然。

XML不需要以
开头,这是来自
man file
()的,对于unix
file
命令:

魔法测试用于检查具有特定固定格式数据的文件。这方面的典型示例是一个二进制可执行文件。。。这些文件在文件开头附近的特定位置存储了一个“幻数”,它告诉UNIX操作系统该文件是二进制可执行文件,以及几种类型中的哪一种通过扩展将“魔术”的概念应用于数据文件。任何在文件中有固定小偏移量的固定标识符的文件通常都可以这样描述。

(我的重点)

下面是
file
命令用来识别
svg
文件()的“魔力”:

。。。
0字符串\14正则表达式[''''\\t]*[0-9.]+['''\\t]*

>>19 search/4096\如何将文件开头读取为二进制-如果找不到任何神奇数字,则将其读取为文本,并尝试将其与已知的文本模式相匹配?@DJV听起来很合理。通过阅读这个问题,二进制幻数和XML的混合触发了一个红色警报。这个答案清楚地表明,解析二进制格式需要一种方法,而读取(基于文本的)XML需要一种完全不同的方法。@heltonbiker。神奇的数字有一个特点:原始性能。这就是为什么答案中包含一个代码示例,该示例演示了所建议方法的有效实现。此外,如果我理解正确,二进制文件本质上是非结构化的,例如纯文本文件。在纯文本中,我们应该包含shebang、doctype等等,而二进制需要那些简洁、神秘的幻数。我相信,从这个意义上讲,这个神奇的数字让人想起了将数据存储到文件中的尽可能小的、低级别的“旧方法”,而XML和JSON等更现代、更具可读性、更膨胀、更冗余的方式将数据存储到文件中。这两种方法在不止一个方面有所不同。从:“在3.3版中更改:此模块将在任何可用的情况下使用快速实现。
xml.etree.cElementTree
模块已被弃用。”我喜欢这一点,但请注意:其中提到了一个漏洞和类似的攻击。测试证实,
et.iterparse()
确实爆炸了。医生建议。
import xml.etree.cElementTree as et

def is_svg(filename):
    tag = None
    with open(filename, "r") as f:
        try:
            for event, el in et.iterparse(f, ('start',)):
                tag = el.tag
                break
        except et.ParseError:
            pass
    return tag == '{http://www.w3.org/2000/svg}svg'
...
0       string        \<?xml\ version=
>14     regex         ['"\ \t]*[0-9.]+['"\ \t]*
>>19    search/4096   \<svg         SVG Scalable Vector Graphics image
...
0       string        \<svg         SVG Scalable Vector Graphics image
...