`
nakupanda
  • 浏览: 418593 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

PHP中实现GZIP解压缩函数

阅读更多

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解压缩函数

    在PHP编程语言中,解压缩函数是用于处理和解析压缩文件(如.zip或.tar.gz)的关键工具。这些函数使得开发者能够方便地读取、提取和操作压缩文件中的内容,这对于数据传输、备份或者存储大量文件时非常有用。下面将...

    php zip gzip tar..压缩解压缩类

    6. **archive.php**:这个文件很可能包含了实现压缩和解压缩功能的核心类或函数。可能定义了一个通用的类,封装了对zip、gzip和tar格式的支持,提供统一的API来处理不同类型的压缩文件。 7. **examples.php**:这个...

    pako gzip 压缩和解压缩(支持中文).rar

    pako库提供了两个主要函数,`pako.gzip()`用于压缩数据,`pako.ungzip()`用于解压缩数据。这两个函数都接受一个字符串作为输入,返回一个压缩或解压缩后的结果。例如,要对一个包含中文字符的字符串进行gzip压缩,你...

    php gzip 在线压缩工具

    2. **Gzdecode()函数**:与`gzencode()`相反,`gzdecode()`用于解压缩已经用Gzip压缩过的字符串。它只需要一个参数,即压缩的字符串,返回值是解压后的原始字符串。 3. **在线压缩工具的工作原理**:这些在线工具...

    PHP在线解压缩程序

    首先,我们要理解PHP中的文件操作函数,这是实现压缩和解压缩的基础。`file_get_contents()`用于读取文件内容,`file_put_contents()`则用于写入文件。在压缩和解压缩过程中,我们会用到`gzencode()`和`gzdecode()`...

    LZW的压缩与解压缩算法的PHP实现.zip

    在PHP中实现LZW压缩与解压缩算法,我们可以分为以下几个关键步骤: 1. **初始化字典**: - 在开始时,字典包含所有可能的一字节字符串(对于ASCII字符集来说是256个)。随着压缩过程,字典会动态扩展,添加由现有...

    PHP在线解压缩

    本篇将详细介绍基于PCLZip库的PHP在线解压缩功能,以及为何在某些环境下选择PCLZip优于gzcompress函数。 1. **PCLZip库介绍** PCLZip是一款强大的PHP库,专门用于处理ZIP文件的创建、读取、更新和解压缩。它由PHP ...

    PHP实例开发源码—PHP实现的超强在线压缩解压缩 脚本代码.zip

    在解压缩方面,PHP可以利用内置的gz系列函数,如gzdecode和gzinflate,来处理GZIP或ZLIB格式的压缩数据。 "使用须知.txt"文件可能包含有关如何正确使用该脚本的重要信息。通常,它会涵盖以下几点: 1. **环境要求**...

    PHP在线解压缩软件

    在解压缩过程中,这些函数用于读取压缩文件内容并将其解压到服务器上的特定目录。 2. **ZipArchive类**:PHP提供了一个名为`ZipArchive`的类,用于处理ZIP格式的压缩文件。你可以创建、打开、修改和提取ZIP档案中的...

    PHP Zip解压 文件在线解压缩的函数代码

    下面是PHP在线解压缩Zip文件的函数代码,我们可以依照这个函数逐步分析: ```php function unzip_file($file, $destination) { // 创建ZipArchive对象实例 $zip = new ZipArchive(); // 尝试打开指定的ZIP文件 ...

    php读取远程gzip压缩网页的方法

    在这个函数中,我们检查了 `$gzip` 参数,如果为 `true`,就启用GZIP解压。这样,`cURL` 将处理GZIP编码的响应。 此外,如果已经得到了GZIP编码的字符串,我们也可以通过自定义函数来解码。这里有一个使用PHP内置...

    PHP开发笔记系列(七)- 压缩与解压缩

    在PHP开发过程中,压缩与解压缩是常见的操作,特别是在处理大量数据或文件传输时。本篇文章将深入探讨PHP中如何实现文件的压缩和解压缩,主要涉及`zip`和`gz`相关的函数库。 首先,我们来看PHP中的`zip`库。`Zip`库...

    PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别

    解压缩功能则是通过inflateInit2()、inflate()和inflateEnd()三个函数组合实现。 在实际编程中,我们可以通过直接指定encoding参数来使用不同的压缩算法。例如,可以指定zlib:ZLIB_ENCODING_DEFLATE、gzip:ZLIB_...

    Gzip

    // 使用 gzdecode() 解压缩 $original = gzdecode($compressed); echo $original; // 输出 "Hello, World!" ``` **Gzip 类库** 在 PHP 中,有一些第三方类库如 `CLASS类库 G` 提供了更高级的 Gzip 功能,比如分块...

    PHP使用zlib扩展实现GZIP压缩输出的方法详解

    标题中的“PHP使用zlib扩展实现GZIP压缩输出的方法详解”指的是在PHP编程环境中,如何利用内置的zlib扩展来实现GZIP压缩技术,以优化大量数据传输时的带宽效率。GZIP是一种广泛使用的数据压缩算法,它可以显著减小...

    php+pako+ajax压缩数据

    2. Pako.js:Pako是一个高性能的JavaScript实现的压缩/解压缩库,它支持Gzip和Deflate算法。在前端,Pako.js用于对从服务器获取的数据进行解压缩,以减轻网络带宽压力和提高加载速度。它具有小巧、快速的特点,使得...

    PHP在线解压 压缩 文件

    这个接口可以使用`$_FILES`全局变量获取上传的文件,然后调用上述的解压缩函数。考虑到安全问题,一定要验证上传文件的类型和大小,并确保目标解压路径的安全性。 4. **性能优化**: - 对于大文件,可以考虑分块...

    php解压或压缩打包文件源码.zip

    - 解压缩:`ZipArchive::extractTo()`方法可以将ZIP文件中的内容解压缩到指定目录。 2. **gz** 函数系列: - 压缩:`gzencode()`和`gzcompress()`用于对字符串进行压缩,生成GZIP或ZLIB格式的数据。 - 解压缩:`...

    PHP开启gzip页面压缩实例代码

    在PHP脚本中,可以通过设置HTTP头部信息来通知浏览器该内容已经被GZIP压缩,然后由浏览器负责解压缩,最终展示给用户。由于浏览器端对GZIP的支持非常普遍,服务器端的压缩就变得尤为重要。 在PHP中实现GZIP压缩,...

    PHP中的gzcompress、gzdeflate、gzencode函数详解

    除了这三个函数外,还应该注意存在一组对应的解压缩函数,分别是gzuncompress、gzinflate和gzdecode。其中,gzdecode函数是在PHP5.4.0之后引入的,使用这个函数时,需要注意其兼容性问题。 在PHP的源码中,可以通过...

Global site tag (gtag.js) - Google Analytics