当前位置: 首页 > 知识库问答 >
问题:

如何zlib膨胀一个gzip/deflate存档

吴驰
2023-03-14

我有一个用gzip1.5编码的存档。我无法使用C zlib库解码它。zlibinflate()返回EC-3 stream.msg=“unknown compression method”。

$ gzip --list --verbose vmlinux.z
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 12169518 Apr 29 13:00             4261643             9199404  53.7% vmlinux

文件的前32个字节是:

00000000  1f 8b 08 08 29 f4 8a 60  00 03 76 6d 6c 69 6e 75  |....)..`..vmlinu|
00000010  78 00 ec 9a 7f 54 1c 55  96 c7 6f 75 37 d0 fc 70  |x....T.U..ou7..p|

如果这是deflate编码的,那么我希望下一个字节@0x12是0AABBBBB(BFINAL=0和BTYPE=一些压缩)

如果这是zlib编码的,我希望下一个字节@0x12采用0AAA1000 bbbcccc的形式

相反,我看到@0x12ec=11101100两者都不符合。

int ZEXPORT unzip (dest, destLen, source, sourceLen)
    Bytef *dest;
    uLongf *destLen;
    const Bytef *source;
    uLong sourceLen;
{
    z_stream stream;
    int err;

    stream.next_in = (Bytef*)source;
    stream.avail_in = (uInt)sourceLen;
    /* Check for source > 64K on 16-bit machine: */
    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;

    stream.next_out = dest;
    stream.avail_out = (uInt)*destLen;
    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;

    stream.zalloc = (alloc_func)my_alloc;
    stream.zfree = (free_func)my_free;

    /*err = inflateInit(&stream);*/
    err = inflateInit2(&stream, 15 + 16);
    if (err != Z_OK) return err;

    err = inflate(&stream, Z_FINISH);
    if (err != Z_STREAM_END) {
        inflateEnd(&stream);
        return err == Z_OK ? Z_BUF_ERROR : err;
    }
    *destLen = stream.total_out;

    err = inflateEnd(&stream);
    return err;
}

我如何更正我对此文件的解码?

共有1个答案

艾阳羽
2023-03-14

假设my_allocmy_free做了它们需要做的事情,这应该很好。您应该验证您确实在向unzip()提供您认为正在提供的数据。您给出的数据需要从1f8b开始。

(旁白:“unzip”是一个糟糕的函数名称。它不能解压缩,因为zip是一种完全不同于gzip或zlib的格式。“gunzip”或“ungzip”是合适的。)

您正在以错误的顺序手动读取放缩流中的位。最低有效位是第一位。ec的低三位是100,指示非最后一个动态块。0表示非最后,然后10表示动态。

您可以使用infgen来拆卸放气流。它提供的14个字节的输出是动态块的初始部分:

dynamic
count 286 27 16
code 0 5
code 2 7
code 3 7
code 4 5
code 5 5
code 6 4
code 7 4
code 8 2
code 9 3
code 10 2
code 11 4
code 12 4
code 16 7
code 17 7
lens 4 6 7 7 7 8 8 8 7 8
repeat 3
lens 10
 类似资料:
  • 可以输出三种格式,我试着搜索了文档和,但是找不到一个关于选项的清晰解释,大家有什么想法吗?

  • 问题内容: 是否存在用于隐藏在Internet上的ByteBuffer的gzip压缩库?是什么让我们可以推送原始数据然后提取缩小的数据?我们已经搜索了它,但是仅找到处理InputStreams和OutputStreams的库。 我们的任务是创建gzip过滤器,以缩小管道体系结构中的ByteBuffers流。这是拉式体系结构,其中最后一个元素从较早的元素中提取数据。我们的gzip过滤器处理ByteB

  • 我想创建一个应用程序,其中NavigationView和Bottom Navigation可以互相工作,但在输出中,我在“Run”中得到了下一个字符串。 .

  • 问题内容: Gzip格式文件(gzip例如,使用程序创建的文件)使用“放气”压缩算法,该压缩算法与zlib使用的压缩算法相同。但是,使用zlib膨胀gzip压缩文件时,该库将返回Z_DATA_ERROR。 如何使用zlib解压缩gzip文件? 问题答案: python zlib库支持: RFC 1950(zlib压缩格式) RFC 1951(deflate压缩格式) RFC 1952(gzip压缩

  • 我试图将我的GLSurfaceView设置在xml布局以及其他UI元素上,并不断获得错误inflating类com.vi.cubo01。MyGLSurfaceView在LogCat. 以下是java代码: 以及xml:

  • 我在自定义控件中膨胀MvxImageView时遇到问题。 从我所做的研究中,我发现了几个嫌疑人 > < li >我是否应该将“如果”添加到“什么”中?(我看到这是关于android地图视图膨胀错误。 < li> 我创建的用户控件是不是都错了?我看到了一个使用SetContentView()而不是inflate的建议,因为它通过mvvmcross机制传递indlate请求,但在自定义视图中没有这样的