创建具有精确固定大小的 zip

Create zip with a precise fixed size

我想创建一个特定大小的 zip 文件,例如 10.000.000 字节。
假设我必须压缩一些文件,压缩后它们总计 8.123.456 字节(随机数)。
我想添加 "rubbish" 以达到 正好 我选择的大小(在本例中为 10Mb)。

当然,我假设我必须压缩的文件不会超过我的限制。

我没有任何特定的语言要求。

将压缩数据打包到另一个格式如下的文件中:

<zip file length><zip file content><random data until size is as required>

你知道随机数据的数量,因为它是要求的大小减去文件长度减去文件长度表示的大小。

要解压缩,只需反向操作即可。

只需连接一个 "rubbish" 文件和一个与您的 10Mb 相匹配的有效 Zip 文件。 Zip 格式就是为这种情况而设计的。通常,您可以连接可执行文件和 Zip 文件以制作安装程序或自解压存档。

这里有一个例子(我连接了一个随机选择的 GIF 和一个 Zip)。 Info-Zip 解压缩工具说:

unzip -v appended.zip
Archive:  appended.zip
warning [appended.zip]:  1772887 extra bytes at beginning or within zipfile
  (attempting to process anyway)
 Length   Method    Size  Ratio   Date   Time   CRC-32    Name
--------  ------  ------- -----   ----   ----   ------    ----
     186  Defl:N      140  25%  15.02.12 12:03  56202537  zip-ada/debg_za.cmd
     349  Defl:N      202  42%  10.02.12 22:19  7718ccec  zip-ada/debug.pra
    4357  Defl:N     1381  68%  24.09.16 06:43  30f2fef0  zip-ada/demo/demo_csv_into_zip.adb
    1015  Defl:N      513  50%  02.10.18 15:49  f0edcf97  zip-ada/demo/demo_unzip.adb
     603  Defl:N      310  49%  20.03.16 08:26  b3906614  zip-ada/demo/demo_zip.adb
  161483  Defl:N    39845  75%  27.08.16 16:35  9f24d1fe  zip-ada/doc/appnote.txt
...

解压测试成功(符合预期):

unzip -t appended.zip
Archive:  appended.zip
warning [appended.zip]:  1772887 extra bytes at beginning or within zipfile
  (attempting to process anyway)
    testing: zip-ada/debg_za.cmd      OK
    testing: zip-ada/debug.pra        OK
    testing: zip-ada/demo/demo_csv_into_zip.adb   OK
    testing: zip-ada/demo/demo_unzip.adb   OK
    testing: zip-ada/demo/demo_zip.adb   OK
    testing: zip-ada/doc/appnote.txt   OK
    testing: zip-ada/doc/lzma-specification.txt   OK
...
No errors detected in compressed data of appended.zip.

您可以在 目标 Zip 文件中添加 "rubbish" 不压缩 文件。 添加的大小将是 "rubbish" 文件的大小加上 76 字节,再加上 "rubbish" 文件名长度的两倍。一些压缩工具在此之上添加额外的元数据。