如何使用数据描述符部分创建zip文件

时间:2016-07-18 13:20:42

标签: zip zipfile

有没有办法创建一个zip文件并强制它从命令行获取数据描述符部分?

1 个答案:

答案 0 :(得分:1)

在对Github(https://github.com/adamhathcock/sharpcompress/issues/88#issuecomment-215696631)的评论中,我发现了使用-fd标志的建议:

  

仅供参考,在创建ZIP文件时,我还使用了命令行参数-fd来强制使用数据描述符。不确定OSX上的ZIP工具是否提供此参数,但我注意到您在创建ZIP文件时没有使用它

所以我测试了它(使用OS X上的标准zip工具," Zip 3。0(2008年7月5日)"),并确认它确实生成了带有数据的zip文件描述符集,如下:

/tmp> touch empty.txt
/tmp> zip -fd foo.zip empty.txt
  adding: empty.txt (stored 0%)
/tmp> xxd foo.zip
00000000: 504b 0304 0a00 0800 0000 698d 7c49 0000  PK........i.|I..
00000010: 0000 0000 0000 0000 0000 0900 1c00 656d  ..............em
00000020: 7074 792e 7478 7455 5409 0003 a65e 3c58  pty.txtUT....^<X
00000030: a65e 3c58 7578 0b00 0104 f501 0000 0400  .^<Xux..........
00000040: 0000 0050 4b07 0800 0000 0000 0000 0000  ...PK...........
00000050: 0000 0050 4b01 021e 030a 0008 0000 0069  ...PK..........i
00000060: 8d7c 4900 0000 0000 0000 0000 0000 0009  .|I.............
00000070: 0018 0000 0000 0000 0000 00b0 8100 0000  ................
00000080: 0065 6d70 7479 2e74 7874 5554 0500 03a6  .empty.txtUT....
00000090: 5e3c 5875 780b 0001 04f5 0100 0004 0000  ^<Xux...........
000000a0: 0000 504b 0506 0000 0000 0100 0100 4f00  ..PK..........O.
000000b0: 0000 5300 0000 0000                      ..S.....

上面16字节的粗体序列是数据描述符部分。 其标头50 4b07 08(或PK..)和数据描述符格式由zip规范(https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT)指定:

  4.3.9  Data descriptor:

        crc-32                          4 bytes
        compressed size                 4 bytes
        uncompressed size               4 bytes

      4.3.9.1 This descriptor MUST exist if bit 3 of the general
      purpose bit flag is set (see below).  It is byte aligned
      and immediately follows the last byte of compressed data.
      This descriptor SHOULD be used only when it was not possible to
      seek in the output .ZIP file, e.g., when the output .ZIP file
      was standard output or a non-seekable device.  For ZIP64(tm) format
      archives, the compressed and uncompressed sizes are 8 bytes each.

...
      4.3.9.3 Although not originally assigned a signature, the value 
      0x08074b50 has commonly been adopted as a signature value 
      for the data descriptor record.  Implementers should be 
      aware that ZIP files may be encountered with or without this 
      signature marking data descriptors and SHOULD account for
      either case when reading ZIP files to ensure compatibility.

要确定是否设置了通用位标志的第三位,我们必须解析zip文件以找到empty.txt的文件头。

请参阅维基百科,以获取简要概述和描述zip文件中字节含义的表格 - https://en.wikipedia.org/wiki/Zip_(file_format) 最后22个字节(从倒数第二行开始,504b 0506(或PK..)是中央目录(EOCD)记录的结尾。在此EOCD记录中的偏移量16处,4字节无符号整数指定中心目录的开头。我们有5300 0000(小端)或0x53 = 83.这恰好是我们上面确定的数据描述符部分之后的偏移量。从启动后的第6个偏移量开始在中心目录中,我们找到一对形成位标志的字节。

0a 00 (little endian) = 00000000 00001010 (binary, big endian)
                                     ^
                            bit 3 of the general purpose flag

确实,设置了第三位(从右侧开始计数,从0开始),因此我们看到上面创建的zip文件确实有一个数据描述符部分。