gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:21:07 28 4
gpt4 key购买 nike

有没有一种方法可以创建一个 zip 文件并强制它在命令行中包含数据描述符部分?

最佳答案

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

Just FYI, when creating the ZIP file i also used the the command line parameter -fd which enforces usage of data descriptors. Not sure whether the ZIP tool on OSX provides this parameter, but i noticed that you didn't use it when creating your ZIP file

所以我测试了它(使用 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.zip00000000: 504b 0304 0a00 0800 0000 698d 7c49 0000  PK........i.|I..00000010: 0000 0000 0000 0000 0000 0900 1c00 656d  ..............em00000020: 7074 792e 7478 7455 5409 0003 a65e 3c58  pty.txtUT....^<X00000030: 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..........i00000060: 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.....

The boldfaced sequence of 16 bytes above is the data descriptor section.Its header 50 4b07 08 (or PK..) and the data descriptor format is specified by the zip specification (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 文件确实有一个数据描述符部分。

关于zip - 如何使用数据描述符部分创建 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38437826/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com