原始 ZIP 大小限制 2^32 与 2^32 - 1. Wikipedia 中是否存在 off by 1 错误?

Original ZIP size limits 2^32 vs 2^32 - 1. Is there an off by 1 error in Wikipedia?

根据https://en.wikipedia.org/wiki/ZIP_(file_format)#ZIP64

The original .ZIP format had a 4 GB (2^32 bytes) limit on various things (uncompressed size of a file, compressed size of a file, and total size of the archive), as well as a limit of 65,535 (2^16-1) entries in a ZIP archive.

2^32 值是否正确?根据我的理解,最大值应该是 32 位无符号整数中的最大可能值,即 2^32-1

根据 https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT 的 ZIP 规范,我知道 2^32-1 确实具有特殊含义(通常被称为 0xFFFFFFFF),所以我不想假设任何东西。

条目数量的 2^16-1 限制 对我来说似乎是正确的,因为可以存储在 16 位无符号整数中的最大值。

上下文:我正在编写代码以在 Python https://github.com/uktrade/stream-zip, as well code to open ZIP files in a streaming way https://github.com/uktrade/stream-unzip 中以流方式写入 ZIP 文件,我希望两者都能正确处理各种限制。或者,如果不“正确”(比如没有“正确”),则尽可能合理。

同一维基百科页面的其他地方包含负 1:https://en.wikipedia.org/wiki/ZIP_(file_format)#Limits

The maximum size for both the archive file and the individual files inside it is 4,294,967,295 bytes (2^32−1 bytes, or 4 GB minus 1 byte) for standard ZIP.

同样在 https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT 的 ZIP 规范中,有各种提及大小字段为 4 个字节,例如

4.4.8 compressed size: (4 bytes)
4.4.9 uncompressed size: (4 bytes)

并且可以存储在其中的最大值是 2^32−1

在同一规范中,它说:

Maximum .ZIP segment size = 4,294,967,295 bytes 

这是 2^32-1(我想适用于单段 ZIP 文件吗?编辑:根据下面的评论,这显然不适用)

所以我认为是的,在 ZIP64 部分有一个错误,最大尺寸 2^32 - 1

他们在那句话中混淆了一些东西,但限制是 232–1 个压缩字节以及 232单个条目中的 –1 个未压缩字节,以及 232–1 的中央目录起始偏移量。并且,如前所述,216–1 个条目。

请注意,中央目录偏移量的限制允许 zip 文件大于 4 GiB,但不会大很多。因此维基百科页面中提到的“存档总大小”限制既不是 4 GiB 也不是 4 GiB – 1。需要将句子分解以提供完全正确的信息。