<php
$location = "";
$ch = curl_init($location);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$r = curl_exec($ch);
curl_close($ch);
$r = mb_convert_encoding($r, 'ISO-8859-1', 'utf-8');
gzuncompress($r);
?>
我的代码返回警告:gzuncompress():数据错误... 那么如何通过url从压缩数据中解压缩如上所述。谢谢你的帮助。
答案 0 :(得分:0)
数据中存在过多的0xc2
和0xc3
字节值,而0xbf
以上没有其他值。原始二进制数据似乎已经以某种方式编码,并将其作为不允许值的转义。
更新
可以处理转义以将其转换为有效的gzip流。对于遇到的每个0xc2
,丢弃0xc2
并按原样取下一个字节。对于遇到的每个0xc3
,丢弃0xc3
并将0x40
添加到下一个字节。
更新2:
为了说明,这里有一些简单的PHP代码,可以对问题中URL返回的数据进行转换,从而产生有效的gzip流(substr()
是可选的):
for ($i = $j = 0; $i < strlen($r); $i++, $j++)
if (ord($r[$i]) == 194 && $i + 1 < strlen($r))
$r[$j] = $r[++$i];
else if (ord($r[$i]) == 195 && $i + 1 < strlen($r))
$r[$j] = chr(ord($r[++$i]) + 64);
else if ($i != $j)
$r[$j] = $r[$i];
$r = substr($r, 0, $j);
echo gzdecode($r);
请注意,您需要使用gzdeocde()
,而不是gzuncompress()
。 gzdecode()
解压缩gzip流,而gzuncompress()
解压缩zlib流。