curl — распаковывает сжатые данные, возвращаемые с URL в Stack Overflow

<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

Решение

Существует чрезмерное количество 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.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]