gzip 可以像 zip 一样只存储一个文件而不压缩它吗?
can gzip only store a file like zip and not compress it?
gzip可以不压缩文件吗?在那种情况下会发生什么?存档是否仍包含 DEFLATE 流?我需要在我的程序中处理这种特殊情况。
是的,如果文件不可压缩,例如如果它已经被压缩,gzip 将创建一个存储块,其中包含源数据,并附加一些 header 和尾部。
如果需要,您可以创建自己的 non-compressed 流。 RFC 1951 第 3.2.3 和 3.2.4 节描述了它是如何完成的。
Deflate 存储块基本上是一个单字节,其值为 0x00 或 0x01(BTYPE=00 和 BFINAL=0,1),后跟 4 个字节的 LEN 和 NLEN,然后是您的实际数据。 LEN 是数据字节数(2^16=64KB),NLEN 是补码。如果超过 64KB,则必须多次执行此操作。最后一个块应将 BFINAL 位设置为 1。
最后,您必须在所有这些前面添加一个 gzip header RFC 1952(假设它是一个 GZIP 流,否则检查 RFC 1950 中的 ZLIB)。 header 包含文件名、时间戳等。您需要花费几个小时的时间——大部分时间将花在理解规范上。
gzip可以不压缩文件吗?在那种情况下会发生什么?存档是否仍包含 DEFLATE 流?我需要在我的程序中处理这种特殊情况。
是的,如果文件不可压缩,例如如果它已经被压缩,gzip 将创建一个存储块,其中包含源数据,并附加一些 header 和尾部。
如果需要,您可以创建自己的 non-compressed 流。 RFC 1951 第 3.2.3 和 3.2.4 节描述了它是如何完成的。
Deflate 存储块基本上是一个单字节,其值为 0x00 或 0x01(BTYPE=00 和 BFINAL=0,1),后跟 4 个字节的 LEN 和 NLEN,然后是您的实际数据。 LEN 是数据字节数(2^16=64KB),NLEN 是补码。如果超过 64KB,则必须多次执行此操作。最后一个块应将 BFINAL 位设置为 1。
最后,您必须在所有这些前面添加一个 gzip header RFC 1952(假设它是一个 GZIP 流,否则检查 RFC 1950 中的 ZLIB)。 header 包含文件名、时间戳等。您需要花费几个小时的时间——大部分时间将花在理解规范上。