解压缩从php中的url返回的压缩数据

时间:2014-09-19 13:57:50

标签: php curl gzip compression

<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从压缩数据中解压缩如上所述。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

数据中存在过多的0xc20xc3字节值,而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流。