2

我有一个启用了“Opera Turbo”的 Opera 浏览器。它是一个代理,将 HTML 重新压缩为更小的格式。我有一个来自 Opera 缓存的文件,它被 turbo 从 2000 kb 压缩到 500 kb。如何将此文件解压缩为可读形式(原始文件几乎没有 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╡╥^┤&gt;ЯеяЯ┌|
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 &mdash; статьи</title>
</head>
<link rel="stylesheet" href="/rus/style.css">
<body bgcolor="#FFFFFF">
<center>
...

压缩文件的大小为 3397 和原始 ~ 8913 字节。原始文件可通过 bzip2 压缩到 3281 字节;通过 gzip 到 3177 字节;通过 lzma 到 2990 字节;由 7z 到 3082 字节;通过 zip 压缩到 3291 字节。

更新:我有信息(来自 chrome opera-mini 扩展http://ompd-proxy.narod.ru/distrib/opera_mini_proxy.crx - 用 7-zip 解压)opera mini 使用它来解压数据webodf/src/core_RawInflate .js这个文件可以帮助我吗?

4

2 回答 2

5

前两个字节78 DA是一个有效的 2 字节zLib 标头(参见 CMF 和 FLG 的第 2.2 节),位于deflate 压缩数据之前。因此可以使用 zLib/deflate 压缩文件。

对于第一次快速测试,您可以像这样使用我的命令行工具Precomp

precomp -v -c- -slow opr00003.tmp

它将报告 zLib 压缩流以及它们被解压缩的大小(“...可以解压缩到...字节”)。如果此操作成功(返回的解压缩大小接近您知道的原始文件大小),请使用您最喜欢的编程语言和zLib 库来解压缩您的数据。

另请注意,如果幸运的话,流(或其中的一部分)可以通过 Precomp 逐位相同地重新压缩,并且输出文件opr00003.pcf包含(部分)解压缩数据,前面有一个小标题。

编辑:正如 osgx 评论和进一步分析显示的那样,使用 zLib/deflate无法解压缩数据,所以这仍然是一个未解决的案例

EDIT2:更新,尤其是链接的 JS表明它放气的,但它似乎是一些自定义变体。与原始代码进行比较以及与原始 zLib 源代码进行比较会有所帮助。

此外,JS 代码当然可以用来尝试解压缩数据。不过,它似乎无法处理 2 字节标头,因此可能必须跳过这些标头。

于 2011-08-04T19:58:50.277 回答
3

Opera turbo 缓存中有不同的文件类型。第一个被引用;一些文件被解压(css和js),并且有Z-packed多文件tar类图像存档(VP8,由纯文本RIFF,WEBP,VP8魔法检测):

Z-packed 文件头示例:

 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

另一个带有 JPG 的 Z 文件示例(“JFIF”魔法是可见的,ffd8ff jpeg-marker 是不可见的;里面有 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.....`.`....

另一种检测到的 (by file) 文件类型是“<000”-文件,示例标题为 (hex)“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 解压。

于 2011-08-04T21:38:26.367 回答