<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, как указано выше. Спасибо за помощь.
Существует чрезмерное количество 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.
Других решений пока нет …