function gzdecode($data) {
$len = strlen($data);
if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
return null; // Not GZIP format (See RFC 1952)
}
$method = ord(substr($data,2,1)); // Compression method
$flags = ord(substr($data,3,1)); // Flags
if ($flags & 31 != $flags) {
// Reserved bits are set -- NOT ALLOWED by RFC 1952
return null;
}
// NOTE: $mtime may be negative (PHP integer limitations)
$mtime = unpack("V", substr($data,4,4));
$mtime = $mtime[1];
$xfl = substr($data,8,1);
$os = substr($data,8,1);
$headerlen = 10;
$extralen = 0;
$extra = "";
if ($flags & 4) {
// 2-byte length prefixed EXTRA data in header
if ($len - $headerlen - 2 < 8) {
return false; // Invalid format
}
$extralen = unpack("v",substr($data,8,2));
$extralen = $extralen[1];
if ($len - $headerlen - 2 - $extralen < 8) {
return false; // Invalid format
}
$extra = substr($data,10,$extralen);
$headerlen += 2 + $extralen;
}
$filenamelen = 0;
$filename = "";
if ($flags & 8) {
// C-style string file NAME data in header
if ($len - $headerlen - 1 < 8) {
return false; // Invalid format
}
$filenamelen = strpos(substr($data,8+$extralen),chr(0));
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
return false; // Invalid format
}
$filename = substr($data,$headerlen,$filenamelen);
$headerlen += $filenamelen + 1;
}
$commentlen = 0;
$comment = "";
if ($flags & 16) {
// C-style string COMMENT data in header
if ($len - $headerlen - 1 < 8) {
return false; // Invalid format
}
$commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
return false; // Invalid header format
}
$comment = substr($data,$headerlen,$commentlen);
$headerlen += $commentlen + 1;
}
$headercrc = "";
if ($flags & 1) {
// 2-bytes (lowest order) of CRC32 on header present
if ($len - $headerlen - 2 < 8) {
return false; // Invalid format
}
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
$headercrc = unpack("v", substr($data,$headerlen,2));
$headercrc = $headercrc[1];
if ($headercrc != $calccrc) {
return false; // Bad header CRC
}
$headerlen += 2;
}
// GZIP FOOTER - These be negative due to PHP's limitations
$datacrc = unpack("V",substr($data,-8,4));
$datacrc = $datacrc[1];
$isize = unpack("V",substr($data,-4));
$isize = $isize[1];
// Perform the decompression:
$bodylen = $len-$headerlen-8;
if ($bodylen < 1) {
// This should never happen - IMPLEMENTATION BUG!
return null;
}
$body = substr($data,$headerlen,$bodylen);
$data = "";
if ($bodylen > 0) {
switch ($method) {
case 8:
// Currently the only supported compression method:
$data = gzinflate($body);
break;
default:
// Unknown compression method
return false;
}
} else {
// I'm not sure if zero-byte body content is allowed.
// Allow it for now... Do nothing...
}
// Verifiy decompressed size and CRC32:
// NOTE: This may fail with large data sizes depending on how
// PHP's integer limitations affect strlen() since $isize
// may be negative for large sizes.
if ($isize != strlen($data) || crc32($data) != $datacrc) {
// Bad format! Length or CRC doesn't match!
return false;
}
return $data;
}
分享到:
相关推荐
在PHP编程语言中,解压缩函数是用于处理和解析压缩文件(如.zip或.tar.gz)的关键工具。这些函数使得开发者能够方便地读取、提取和操作压缩文件中的内容,这对于数据传输、备份或者存储大量文件时非常有用。下面将...
6. **archive.php**:这个文件很可能包含了实现压缩和解压缩功能的核心类或函数。可能定义了一个通用的类,封装了对zip、gzip和tar格式的支持,提供统一的API来处理不同类型的压缩文件。 7. **examples.php**:这个...
pako库提供了两个主要函数,`pako.gzip()`用于压缩数据,`pako.ungzip()`用于解压缩数据。这两个函数都接受一个字符串作为输入,返回一个压缩或解压缩后的结果。例如,要对一个包含中文字符的字符串进行gzip压缩,你...
2. **Gzdecode()函数**:与`gzencode()`相反,`gzdecode()`用于解压缩已经用Gzip压缩过的字符串。它只需要一个参数,即压缩的字符串,返回值是解压后的原始字符串。 3. **在线压缩工具的工作原理**:这些在线工具...
首先,我们要理解PHP中的文件操作函数,这是实现压缩和解压缩的基础。`file_get_contents()`用于读取文件内容,`file_put_contents()`则用于写入文件。在压缩和解压缩过程中,我们会用到`gzencode()`和`gzdecode()`...
在PHP中实现LZW压缩与解压缩算法,我们可以分为以下几个关键步骤: 1. **初始化字典**: - 在开始时,字典包含所有可能的一字节字符串(对于ASCII字符集来说是256个)。随着压缩过程,字典会动态扩展,添加由现有...
本篇将详细介绍基于PCLZip库的PHP在线解压缩功能,以及为何在某些环境下选择PCLZip优于gzcompress函数。 1. **PCLZip库介绍** PCLZip是一款强大的PHP库,专门用于处理ZIP文件的创建、读取、更新和解压缩。它由PHP ...
在解压缩方面,PHP可以利用内置的gz系列函数,如gzdecode和gzinflate,来处理GZIP或ZLIB格式的压缩数据。 "使用须知.txt"文件可能包含有关如何正确使用该脚本的重要信息。通常,它会涵盖以下几点: 1. **环境要求**...
在解压缩过程中,这些函数用于读取压缩文件内容并将其解压到服务器上的特定目录。 2. **ZipArchive类**:PHP提供了一个名为`ZipArchive`的类,用于处理ZIP格式的压缩文件。你可以创建、打开、修改和提取ZIP档案中的...
下面是PHP在线解压缩Zip文件的函数代码,我们可以依照这个函数逐步分析: ```php function unzip_file($file, $destination) { // 创建ZipArchive对象实例 $zip = new ZipArchive(); // 尝试打开指定的ZIP文件 ...
在这个函数中,我们检查了 `$gzip` 参数,如果为 `true`,就启用GZIP解压。这样,`cURL` 将处理GZIP编码的响应。 此外,如果已经得到了GZIP编码的字符串,我们也可以通过自定义函数来解码。这里有一个使用PHP内置...
在PHP开发过程中,压缩与解压缩是常见的操作,特别是在处理大量数据或文件传输时。本篇文章将深入探讨PHP中如何实现文件的压缩和解压缩,主要涉及`zip`和`gz`相关的函数库。 首先,我们来看PHP中的`zip`库。`Zip`库...
解压缩功能则是通过inflateInit2()、inflate()和inflateEnd()三个函数组合实现。 在实际编程中,我们可以通过直接指定encoding参数来使用不同的压缩算法。例如,可以指定zlib:ZLIB_ENCODING_DEFLATE、gzip:ZLIB_...
// 使用 gzdecode() 解压缩 $original = gzdecode($compressed); echo $original; // 输出 "Hello, World!" ``` **Gzip 类库** 在 PHP 中,有一些第三方类库如 `CLASS类库 G` 提供了更高级的 Gzip 功能,比如分块...
标题中的“PHP使用zlib扩展实现GZIP压缩输出的方法详解”指的是在PHP编程环境中,如何利用内置的zlib扩展来实现GZIP压缩技术,以优化大量数据传输时的带宽效率。GZIP是一种广泛使用的数据压缩算法,它可以显著减小...
2. Pako.js:Pako是一个高性能的JavaScript实现的压缩/解压缩库,它支持Gzip和Deflate算法。在前端,Pako.js用于对从服务器获取的数据进行解压缩,以减轻网络带宽压力和提高加载速度。它具有小巧、快速的特点,使得...
这个接口可以使用`$_FILES`全局变量获取上传的文件,然后调用上述的解压缩函数。考虑到安全问题,一定要验证上传文件的类型和大小,并确保目标解压路径的安全性。 4. **性能优化**: - 对于大文件,可以考虑分块...
- 解压缩:`ZipArchive::extractTo()`方法可以将ZIP文件中的内容解压缩到指定目录。 2. **gz** 函数系列: - 压缩:`gzencode()`和`gzcompress()`用于对字符串进行压缩,生成GZIP或ZLIB格式的数据。 - 解压缩:`...
在PHP脚本中,可以通过设置HTTP头部信息来通知浏览器该内容已经被GZIP压缩,然后由浏览器负责解压缩,最终展示给用户。由于浏览器端对GZIP的支持非常普遍,服务器端的压缩就变得尤为重要。 在PHP中实现GZIP压缩,...
除了这三个函数外,还应该注意存在一组对应的解压缩函数,分别是gzuncompress、gzinflate和gzdecode。其中,gzdecode函数是在PHP5.4.0之后引入的,使用这个函数时,需要注意其兼容性问题。 在PHP的源码中,可以通过...