Как Opera Turbo сжимает данные (кеш)?
У меня браузер Opera с включенным Opera Turbo. Это прокси, который сжимает HTML в меньший формат. У меня есть файл из кеша оперы, который был сжат турбо от 2000 кб до 500 кб. Как я могу распаковать этот файл в читаемую форму (исходный файл почти не имеет HTML-тегов, только 8-битный текст "<p>
"теги и html заголовок / нижний колонтитул)?
Вот пример такого файла:
.opera$ hexdump -C cache/turbo/g_0000/opr00003.tmp
00000000 78 da 6c 8f bf 4e c4 30 0c c6 67 fa 14 26 48 6c |xзl▐©Nд0.фgЗ.&Hl|
00000010 a1 1c 12 d3 25 1d f8 37 82 54 f1 02 69 63 48 74 |║..с%.Ь7┌TЯ.icHt|
00000020 69 52 12 97 d2 b7 ed 88 40 80 b8 05 06 06 7a 57 |iR.≈р╥М┬@─╦...zW|
00000030 09 21 84 27 fb f3 cf 9f 6d 61 a8 71 45 26 0c 2a |.!└'ШСо÷ma╗qE&.*|
00000040 5d 64 3b a2 41 52 60 88 5a 8e 77 9d bd 97 ec 34 |]d;╒AR`┬Z▌w²╫≈Л4|
00000050 78 42 4f fc 7a 68 91 41 3d 57 92 11 3e 50 be 99 |xBOЭzh▒A=W▓.>P╬≥|
00000060 5d 42 6d 54 4c 48 b2 b7 5e 87 3e f1 c5 d1 f1 82 |]BmTLH╡╥^┤>ЯеяЯ┌|
00000070 fd 78 79 d5 a0 64 1a 53 1d 6d 4b 36 f8 5f 26 ef |Щxyу═d.S.mK6Ь_&О|
00000080 eb 71 fd f5 f8 97 5d e1 d0 87 a8 d3 ff 20 59 72 |КqЩУЬ≈]Ап┤╗сЪ Yr|
00000090 58 94 5d 4a 56 41 f0 40 06 e1 12 09 f6 1b ad 92 |X■]JVAП@.А..Ж.╜▓|
000000a0 59 c2 8c 8a 7c e6 32 91 cf 9f 09 67 fd 0a 22 3a |Yб▄┼|Ф2▒о÷.gЩ.":|
...
и вот часть оригинального файла (я не уверен, действительно ли это оригинальный файл или нет, но очень вероятно, что это так):
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta name="description" content="статьи">
<meta name="keywords" content="статьи">
<title>Russia on the Net — статьи</title>
</head>
<link rel="stylesheet" href="/rus/style.css">
<body bgcolor="#FFFFFF">
<center>
...
Размер сжатого файла составляет 3397 и оригинал ~ 8913 байт. Исходный файл сжимается с помощью bzip2 до 3281 байта; gzip до 3177 байт; от lzma до 2990 байт; от 7z до 3082 байт; по почтовому индексу до 3291 байта.
Обновление: у меня есть информация (из расширения chrome opera-mini http://ompd-proxy.narod.ru/distrib/opera_mini_proxy.crx - распакуйте его с 7-zip), что Opera Mini использует это для распаковки данных webodf/src/core_RawInflate.js Может ли этот файл помочь мне?
2 ответа
Первые два байта 78 DA
являются действительным 2-байтовым заголовком zLib (см. раздел 2.2 по CMF и FLG), который предшествует сжатию сжатых данных. Таким образом, файл может быть сжат с помощью zLib/deflate.
Для первого быстрого теста вы можете использовать мой инструмент командной строки Precomp, например:
precomp -v -c- -slow opr00003.tmp
Он сообщит о сжатых потоках zLib и о том, насколько они распакованы ("... может быть распаковано в... байты"). Если это успешно (возвращает распакованный размер, близкий к размеру файла, который вы знаете), используйте ваш любимый язык программирования вместе с библиотекой zLib для распаковки ваших данных.
Также обратите внимание, что если вам повезет, поток (или его часть) может быть скомпрессирован бит-в-бит, идентичным Precomp и выходному файлу opr00003.pcf
содержит (часть) распакованные данные, которым предшествует небольшой заголовок.
РЕДАКТИРОВАТЬ: Как прокомментировал osgx и дальнейший анализ, данные не могут быть распакованы с использованием zLib/deflate, так что это все еще не решенный случай.
РЕДАКТИРОВАТЬ 2: Обновление и особенно связанный JS показывают, что это является дефлятом, но это, кажется, некоторый пользовательский вариант. Может помочь сравнение с исходным кодом, а также сравнение с исходным исходным кодом zLib.
Кроме того, JS-код, конечно, можно использовать для распаковки данных. Похоже, он не обрабатывает 2-байтовый заголовок, поэтому, возможно, их следует пропустить.
В опера турбо кеш есть разные типы файлов. Первый процитирован под вопросом; некоторые файлы распакованы (css и js), и есть Z-упакованный многофайловый tar-подобный архив изображений (VP8, обнаруженный с помощью простого текста RIFF,WEBP,VP8 magics):
Пример Z-упакованного заголовка файла:
5a 03 01 1c 90 02 0a 22 03 18 2a (RIFF data first img) (RIFF data second img)
(RIFF data third img)
Контейнер RIFF хорошо виден и имеет поле длины, поэтому я предлагаю описание:
5a - magic of format
03 - number of files
01 - first file (riff size=0x1c90)
1c 90 - big-endian len of first file
02 - second file (riff size=0a22)
0a 22 - len of second file
03 - third file (riff size=182a)
18 2a
52 49 46 46 == "RIFF" magic of first file
Еще один пример Z-файла с JPG (магия "JFIF" видна, jpeg-маркер ffd8ff невидим; 8 файлов внутри):
0000000: 5a08 0118 de02 1cab 0308 0804 162c 0531 Z............,.1
0000010: 4d06 080f 070a 4608 0964"ffd8 ffe0 0010 M.....F..d......
0000020: 4a46 4946 0001 0101 0060 0060 0000 ffdb JFIF.....`.`....
Еще один обнаружен file
) тип файла "<000"-файл с примером заголовка (шестнадцатеричный) "1f 8b 08 00 00 00 00 00 02 ff ec 52 cb 6a c3 30 10 fc 15 63". file
говорит, что это "gzip compressed data, max compression
", и он просто распаковывается любым gzip.