【问题标题】:Uncompress a compressed data returned from a url in php解压缩从 php 中的 url 返回的压缩数据
【发布时间】:2014-09-19 13:57:50
【问题描述】:
<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(): data error in... 那么如何通过上述 url 从压缩数据中解压缩。感谢您的帮助。

【问题讨论】:

  • 我认为您尝试解压缩的响应数据确实有问题。将有效负载保存在文件中并使用 gzip 解压缩会导致: gzip: data.gz: not in gzip 格式。正确的压缩、编码、...?
  • 我无法确定从该 URL 返回的数据的头部或尾部。
  • 没错,从 url 以 gzip 格式返回的数据,编码为 ISO-8859-1,并在 C#.net 中解压缩,但在 php 中,我的代码出现了上述问题。

标签: php curl gzip compression


【解决方案1】:

数据中有过多的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 流。

【讨论】:

  • 不,仍然警告:gzuncompress(): data error ... a
  • 您不需要进行其他转换,例如mb_convert_encoding,你需要使用gzdecode(),而不是gzuncompress()
  • 是的,马克·阿德勒。真的,我非常感谢你。我想问你为什么会在数据中出现 0xc2 和 0xc3 字节值?也许是编码 ISO-8859-1 导致了这个问题?
  • 不,和字符集无关。看起来服务器正在对数据进行编码,就像您可能使用这些转义字符的 URI 一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多