Выкачать завышенный отличается от исходного пакета для zlib

#android #perl #zlib #deflate

#Android #perl #zlib #выкачать

Вопрос:

У меня есть приложение, которое создает несколько закодированных смешанных двоично-строковых пакетов: ecbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ecd5f7707cf6ff76bfcfc7efe9f000000ffff (этот исходящий) Итак, по нижнему колонтитулу я вижу, что это zlib (deflate). Я могу полностью декодировать входящий пакет, просто добавив заголовок «789c», но это проблема.

Этот код:

 use Compress::Zlib ;

$string ="789cecbd07601c499625262f6dca7b7f4af54ad7e074a10880601324d8904010ecc188cde692ec1d69472329ab2a81ca6556655d661640cced9dbcf7de7befbdf7de7befbdf7ba3b9d4e27f7dfff3f5c6664016cf6ce4adac99e2180aac81f3f7e7c1f3f227ecd5f7707cf6ff76bfcfc7efe9f000000ffff";
# Converting to string
while($string =~ /(ww)/) {
    $str = $1;
    $string =~ s/$str//;
    $value .= chr(hex($str));
}
$output = $value;
my $x = inflateInit( )
   or die "Cannot create a inflation streamn" ;
($output2, $status) = $x->inflate($value) ;
    print "status:$status - errorn" if $status != Z_OK and $status != Z_STREAM_END ;
    print "out:".(uc unpack 'H*', $output2); print "n"; 
  

Возвращает меня:
out:0105303030303018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Это выглядит неправильно, как будто какая-то информация была изменена на нули. И если я попытаюсь выполнить то же самое, этот результат у меня есть 789c62643500010986910d00000000ffff , но не исходный пакет. Чего мне не хватает?

Ответ №1:

У вас есть действительный, хотя и очень неэффективный, поток частичной дефляции, состоящий из динамического блока и пустого сохраненного блока. Нет блока, помеченного как последний блок, поэтому это неполный необработанный поток deflate.

Нет никакой гарантии, что повторное сжатие распакованных данных вернет вам тот же сжатый поток.

То, что у вас есть, является частью необработанного потока deflate. Вы должны использовать параметр -MAX_WBITS (-15) для inflateInit() . В отличие от предварения заголовком zlib. Трейлера zlib нет, поэтому вы получите сообщение об ошибке без этого параметра.

Он заканчивается пустым сохраненным блоком (который частично можно увидеть как 0000ffff в конце), что указывает на то, что тот, кто его создал, хотел, чтобы эта часть заканчивалась на границе байта, чтобы ее можно было передать целиком. Предположительно, за ним последует другой.

Ваш поток представляет собой правильный необработанный динамический блок deflate, за которым следует пустой сохраненный блок, который занимает все 118 байт. Я не знаю, какой компрессор это сделал, но он сделал это очень неэффективно, поскольку использовал динамический блочный тип с большим количеством накладных расходов для очень небольшого объема данных. Тот гораздо меньший необработанный частичный поток deflate, который вы получили обратно 62643500010986910d00000000ffff , корректно использует статический блок с фиксированными кодами и почти без накладных расходов. Он распаковывается до того же.