测试文件是否为 zip 文件的好方法是什么?

发布于 2024-08-14 06:49:34 字数 122 浏览 5 评论 0原文

我正在寻找新的文件格式规范,该规范表示该文件可以是基于 xml 的文件,也可以是包含 xml 文件和其他文件的 zip 文件。

两种情况下的文件扩展名相同。我可以通过哪些方式测试文件来决定是否需要解压缩或只是读取?

I am looking as a new file format specification and the specification says the file can be either xml based or a zip file containing an xml file and other files.

The file extension is the same in both cases. What ways could I test the file to decide if it needs decompressing or just reading?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

紅太極 2024-08-21 06:49:34

zip 文件格式由 PKWARE 定义。您可以在此处找到其文件规范。

在顶部附近,您将找到标头规范:

A.本地文件头:

 本地文件头签名 4 字节 (0x04034b50)
    提取 2 个字节所需的版本
    通用位标志 2 字节
    压缩方式 2字节
    最后一个 mod 文件时间 2 个字节
    最后一个 mod 文件日期 2 个字节
    crc-32 4 字节
    压缩大小 4 字节
    未压缩大小 4 字节
    文件名长度2字节
    额外字段长度 2 个字节

    文件名(可变大小)
    额外字段(可变大小)

从这里可以看出,头的前4个字节应该是文件签名,应该是十六进制值0x04034b50。文件中的字节顺序是相反的 - PKWARE 指定“除非另有指定,否则所有值都以小端字节顺序存储。”,因此如果您使用十六进制编辑器查看文件,您将看到 50 4b 03 04 作为前 4 个字节。

您可以使用它来检查您的文件是否是 zip 文件。如果您在记事本中打开该文件,您会注意到前两个字节(50 和 4b)是 ASCII 字符 PK。

The zip file format is defined by PKWARE. You can find their file specification here.

Near the top you will find the header specification:

A. Local file header:

    local file header signature     4 bytes  (0x04034b50)
    version needed to extract       2 bytes
    general purpose bit flag        2 bytes
    compression method              2 bytes
    last mod file time              2 bytes
    last mod file date              2 bytes
    crc-32                          4 bytes
    compressed size                 4 bytes
    uncompressed size               4 bytes
    file name length                2 bytes
    extra field length              2 bytes

    file name (variable size)
    extra field (variable size)

From this you can see that the first 4 bytes of the header should be the file signature which should be the hex value 0x04034b50. Byte order in the file is the other way round - PKWARE specify that "All values are stored in little-endian byte order unless otherwise specified.", so if you use a hex editor to view the file you will see 50 4b 03 04 as the first 4 bytes.

You can use this to check if your file is a zip file. If you open the file in notepad, you will notice that the first two bytes (50 and 4b) are the ASCII characters PK.

递刀给你 2024-08-21 06:49:34

您可以查看文件的幻数。 ZIP 存档的内容列于 ZIP 格式维基百科页面PK\003\004 或 PK\005\006

You could look at the magic number of the file. The ones for ZIP archives are listed on the ZIP format wikipedia page: PK\003\004 or PK\005\006.

感情旳空白 2024-08-21 06:49:34

检查文件的前几个字节中的幻数。 Zip 文件以 PK (50 4B) 开头。由于 XML 文件无法以这些字符开头并且仍然有效,因此您可以相当确定文件类型。

Check the first few bytes of the file for the magic number. Zip files begin with PK (50 4B). As XML files cannot start with these characters and still be valid, you can be fairly sure as to the file type.

天涯沦落人 2024-08-21 06:49:34

您可以使用 file 来查看它是文本文件(xml)还是可执行文件(拉链)。
向下滚动查看示例。

You can use file to see if it's a text file(xml) or an executable(zip).
Scroll down to see an example.

荒路情人 2024-08-21 06:49:34

虽然这不是一个好的解决方案,但只是想减轻负担......怎么样:

try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}

Not a good solution though, but just thinking out load... how about:

try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}
蓝梦月影 2024-08-21 06:49:34

您可以检查该文件以查看它是否包含有效的 XML 标头。如果没有,请尝试解压。

请参阅单击此处了解 XML 规范。

You could check the file to see if it contains a valid XML header. If it doesn't, try decompressing it.

See Click here for XML specification.

情绪少女 2024-08-21 06:49:34

文件幻数

澄清一下,它以 50 开头4b 03 04.

请参阅 http://www.pkware.com/documents/casestudies/APPNOTE .TXT(来自西蒙·P·史蒂文斯)

File magic numbers

To clarify, it starts with 50 4b 03 04.

See http://www.pkware.com/documents/casestudies/APPNOTE.TXT (From Simon P Stevens)

赠意 2024-08-21 06:49:34

您可以尝试解压缩它 - XML 文件极不可能是有效的 zip 文件,或者可以检查幻数,正如其他人所说。

You could try unzipping it - an XML file is exceedingly unlikely to be a valid zip file, or could check the magic numbers, as others have said.

谢绝鈎搭 2024-08-21 06:49:34

这取决于你使用的是什么,但 zip 库可能有一个函数来测试文件是否是 zip 文件
像 is_zip、test_file_zip 之类的东西...

或者使用上面给出的幻数创建您自己的函数。

it depends on what you are using but the zip library might have a function that test wether a file or not is a zip file
something like is_zip, test_file_zip or whatever ...

or create you're own function by using the magic number given above.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文