<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>解码函数 &#8211; LPC影子技术分享</title>
	<atom:link href="https://www.mudbest.com/tag/%e8%a7%a3%e7%a0%81%e5%87%bd%e6%95%b0/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.mudbest.com</link>
	<description>行影不离,忘之却步.</description>
	<lastBuildDate>Mon, 01 Oct 2012 09:05:58 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>
	<item>
		<title>gzip解码函数gzdecode()</title>
		<link>https://www.mudbest.com/gzip%e8%a7%a3%e7%a0%81%e5%87%bd%e6%95%b0gzdecode/</link>
		
		<dc:creator><![CDATA[hkshadow]]></dc:creator>
		<pubDate>Sun, 18 Sep 2011 07:08:07 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Gzip]]></category>
		<category><![CDATA[解码函数]]></category>
		<guid isPermaLink="false">http://www.mudbest.com/?p=797</guid>

					<description><![CDATA[最近采集土豆，发现土豆的页面貌似用了gzip，当使用file_get_contents()获取得到的是一些乱码 ... <a title="gzip解码函数gzdecode()" class="read-more" href="https://www.mudbest.com/gzip%e8%a7%a3%e7%a0%81%e5%87%bd%e6%95%b0gzdecode/" aria-label="阅读 gzip解码函数gzdecode()">阅读更多</a>]]></description>
										<content:encoded><![CDATA[<p>最近采集土豆，发现土豆的页面貌似用了gzip，当使用file_get_contents()获取得到的是一些乱码，当时试着将页面的编码改来改去，但还是不行，想到了以前碰到类似的情况，好吧，果然。</p>
<p>分析：<br />
大概有2种情况，1是自身的页面编码，和获取的页面编码不一致。<br />
另外的一种情况就是，目标页面用了gzip技术。<br />
用以下的函数可解决这个问题：</p>
<p><span id="more-797"></span></p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

function gzdecode($data) {
	$len = strlen ( $data );
	if ($len &lt; 18 || strcmp ( substr ( $data, 0, 2 ), &quot;\x1f\x8b&quot; )) {
		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 &amp; 31 != $flags) {
		// Reserved bits are set -- NOT ALLOWED by RFC 1952 
		return null;
	}
	// NOTE: $mtime may be negative (PHP integer limitations) 
	$mtime = unpack ( &quot;V&quot;, substr ( $data, 4, 4 ) );
	$mtime = $mtime &#x5B;1];
	$xfl = substr ( $data, 8, 1 );
	$os = substr ( $data, 8, 1 );
	$headerlen = 10;
	$extralen = 0;
	$extra = &quot;&quot;;
	if ($flags &amp; 4) {
		// 2-byte length prefixed EXTRA data in header 
		if ($len - $headerlen - 2 &lt; 8) {
			return false; // Invalid format 
		}
		$extralen = unpack ( &quot;v&quot;, substr ( $data, 8, 2 ) );
		$extralen = $extralen &#x5B;1];
		if ($len - $headerlen - 2 - $extralen &lt; 8) {
			return false; // Invalid format 
		}
		$extra = substr ( $data, 10, $extralen );
		$headerlen += 2 + $extralen;
	}
	
	$filenamelen = 0;
	$filename = &quot;&quot;;
	if ($flags &amp; 8) {
		// C-style string file NAME data in header 
		if ($len - $headerlen - 1 &lt; 8) {
			return false; // Invalid format 
		}
		$filenamelen = strpos ( substr ( $data, 8 + $extralen ), chr ( 0 ) );
		if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 &lt; 8) {
			return false; // Invalid format 
		}
		$filename = substr ( $data, $headerlen, $filenamelen );
		$headerlen += $filenamelen + 1;
	}
	
	$commentlen = 0;
	$comment = &quot;&quot;;
	if ($flags &amp; 16) {
		// C-style string COMMENT data in header 
		if ($len - $headerlen - 1 &lt; 8) {
			return false; // Invalid format 
		}
		$commentlen = strpos ( substr ( $data, 8 + $extralen + $filenamelen ), chr ( 0 ) );
		if ($commentlen === false || $len - $headerlen - $commentlen - 1 &lt; 8) {
			return false; // Invalid header format 
		}
		$comment = substr ( $data, $headerlen, $commentlen );
		$headerlen += $commentlen + 1;
	}
	
	$headercrc = &quot;&quot;;
	if ($flags &amp; 1) {
		// 2-bytes (lowest order) of CRC32 on header present 
		if ($len - $headerlen - 2 &lt; 8) {
			return false; // Invalid format 
		}
		$calccrc = crc32 ( substr ( $data, 0, $headerlen ) ) &amp; 0xffff;
		$headercrc = unpack ( &quot;v&quot;, substr ( $data, $headerlen, 2 ) );
		$headercrc = $headercrc &#x5B;1];
		if ($headercrc != $calccrc) {
			return false; // Bad header CRC 
		}
		$headerlen += 2;
	}
	
	// GZIP FOOTER - These be negative due to PHP's limitations 
	$datacrc = unpack ( &quot;V&quot;, substr ( $data, - 8, 4 ) );
	$datacrc = $datacrc &#x5B;1];
	$isize = unpack ( &quot;V&quot;, substr ( $data, - 4 ) );
	$isize = $isize &#x5B;1];
	
	// Perform the decompression: 
	$bodylen = $len - $headerlen - 8;
	if ($bodylen &lt; 1) {
		// This should never happen - IMPLEMENTATION BUG! 
		return null;
	}
	$body = substr ( $data, $headerlen, $bodylen );
	$data = &quot;&quot;;
	if ($bodylen &gt; 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;
}

?&gt;
</pre>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
