【问题标题】:Deflating data from MSZIP format从 MSZIP 格式压缩数据
【发布时间】:2017-01-16 08:23:29
【问题描述】:

我正在尝试读取压缩的二进制 .x 网格文件,但我的解压缩失败。该文件基本上是一些directx头信息,然后是一堆MSZIP格式的数据(即2个字节是一个int blockSize,2个字节是一个“幻数”,然后是blockSize放气字节,然后重复直到有没有更多数据)所以对于每个块我只是得到压缩字节并像这样放气-

internal static byte[] DecompressBlock(byte[] data) {
    var result = new List<byte>();
    var ms = new MemoryStream(data);
    var ds = new DeflateStream(ms, CompressionMode.Decompress);
    var newStream = new MemoryStream();
    ds.CopyTo(newStream);
    ds.Flush();
    ds.Close();
    return newStream.GetBuffer();
}

第一个块按预期放气。随后的块是正确的膨胀大小,但是,看似随机的,一些字节不应该是 0,通常以 4-12 个为一组。

如何在保持相同历史缓冲区的同时压缩不同的压缩数据块?

更新:经过更多研究,看起来在 MSZIP 压缩中这些块是单独放气操作的结果,但它们之间保留了“历史缓冲区”我不知道 deflatestream 是否能够处理这。更新了实际问题

【问题讨论】:

    标签: zip compression deflate deflatestream


    【解决方案1】:

    是的,您缺少一些东西。每个放气块可以并且确实使用前一个放气块的历史记录。因此,在每个块中,您必须使用前块的最后 32K 未压缩数据初始化 deflate 字典。

    【讨论】:

    • 谢谢!在我更新问题之前我没有看到这个。我想你不会知道在 c# 中执行此操作的方法吗?
    • Deflate 类似乎没有提供对 zlib 的 deflateSetDictionary() 函数的访问。您需要直接使用 zlib。
    • 实际上,如果您直接使用 zlib,则可以使用我为此添加的未记录的 deflateResetKeep() 函数。它启动一个新的 deflate 流,但使用该状态使字典与刚刚完成的 deflate 保持一致。还有一个对应的inflateResetKeep()
    • 谢谢!需要更多字符来评论
    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 2017-04-21
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多