Есть ли способ проверить, является ли строка gzdeflated?

то есть, тест на то, могу ли я безопасно gzinflate строку.

Если мои сжатые данные были подделаны, я получаю предупреждение "плохие данные". Я не хочу подавлять предупреждение, которое означает, что я должен либо поймать его, либо проверить, что он может быть gzinflated. Последнее-мое предпочтительное решение, но я просто не знаю, как это сделать.

что-то, чтобы соответствовать образцу кода ниже, было бы идеально:

if(i_can_haz_inflate($data))
{
    // go ahead
    $source = gzinflate($data);
}
else
{
    // bad data
}

Edit: указав GZ (de|in)flate, я приходите к пониманию, что я на самом деле не слишком беспокоюсь об алгоритме сжатия. Есть ли там какие-либо, которые лучше подходят для проверки целостности перед попыткой декомпрессии?

2 ответов


gzinflate() возвращает исходную строку, если это не gzdeflate() закодированную строку.

наиболее очевидной проверкой было бы:

$deflated = @gzinflate($data); // to avoid getting a warning
if ($data != $deflated && $deflated !== FALSE) {
     $source  = gzinflate($data);
}

Я не думаю, что есть другой способ сделать это.


Я согласен с @Vlad Preda ответ, но мы можем преобразовать предупреждение исключение:

set_error_handler(function ($code, $description) {
    throw new \RuntimeException($description, $code);
});
$deflated = gzinflate($data);
restore_error_handler();

и он предоставляет нам возможность обрабатывать исключения... и не подавляйте предупреждения...