gpt4 book ai didi

php - gzcompress 是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:07:09 26 4
gpt4 key购买 nike

我想知道为什么我需要在使用 gzcompress() 后切断最后 4 个字符。

这是我的代码:

header("Content-Encoding: gzip");
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
$index = $smarty->fetch("design/templates/main.htm") ."\n<!-- Compressed by gzip -->";
$this->content_size = strlen($index);
$this->content_crc = crc32($index);
$index = gzcompress($index, 9);
$index = substr($index, 0, strlen($index) - 4); // Why cut off ??
echo $index;
echo pack('V', $this->content_crc) . pack('V', $this->content_size);

当我不删除最后 4 个字符时,源代码的结尾如下:

[...]
<!-- Compressed by gzip -->N

当我剪掉它们时,上面写着:

[...]
<!-- Compressed by gzip -->

我只能在 Chromes 代码检查器中看到额外的 N(在 Firefox 和 IEs 源中都没有)。但是在代码的末尾有四个额外的字符。

谁能解释一下,为什么我需要切断 4 个字符?

最佳答案

gzcompress实现 ZLIB compressed data formatfollowing structure :

     0   1
+---+---+
|CMF|FLG| (more-->)
+---+---+

(if FLG.FDICT set)

0 1 2 3
+---+---+---+---+
| DICTID | (more-->)
+---+---+---+---+

+=====================+---+---+---+---+
|...compressed data...| ADLER32 |
+=====================+---+---+---+---+

在这里你看到最后四个字节是 Adler-32 checksum .

与此相反,GZIP file format是具有以下结构的所谓成员的列表:

   +---+---+---+---+---+---+---+---+---+---+
|ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->)
+---+---+---+---+---+---+---+---+---+---+

(if FLG.FEXTRA set)

+---+---+=================================+
| XLEN |...XLEN bytes of "extra field"...| (more-->)
+---+---+=================================+

(if FLG.FNAME set)

+=========================================+
|...original file name, zero-terminated...| (more-->)
+=========================================+

(if FLG.FCOMMENT set)

+===================================+
|...file comment, zero-terminated...| (more-->)
+===================================+

(if FLG.FHCRC set)

+---+---+
| CRC16 |
+---+---+

+=======================+
|...compressed blocks...| (more-->)
+=======================+

0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| CRC32 | ISIZE |
+---+---+---+---+---+---+---+---+

如您所见,GZIP 使用 CRC-32 checksum用于完整性检查。

所以分析你的代码:

  • echo "\x1f\x8b\x08\x00\x00\x00\x00\x00"; – 输出以下 header 字段:
    • 0x1f 0x8b – ID1 和 ID2,标识数据格式的标识符(这些是固定值)
    • 0x08 – CM,使用的压缩方法; 8 表示使用 DEFLATE data compression format (RFC 1951)
    • 0x00 – FLG,标志
    • 0x00000000 – MTIME,修改时间
    • 字段XFL(额外标志)和OS(操作系统)由DEFLATE数据压缩格式设置
  • echo $index; – 按照DEFLATE数据压缩格式输出压缩数据
  • echo pack('V', $this->content_crc) 。 pack('V', $this->content_size); – 以二进制形式输出 CRC-32 校验和和未压缩输入数据的大小

关于php - gzcompress 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3202218/

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