从 MSZIP 格式压缩数据

Deflating data from MSZIP format

我正在尝试读取压缩的二进制 .x 网格文件,但解压失败。该文件基本上是一些 directx header 信息,然后是一堆 MSZIP 格式的数据(即 2 个字节是一个 int blockSize,2 个字节是一个 "magic number" 然后是 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 压缩中,这些块似乎是单独的压缩操作的结果,但它们之间保持 "history buffer" 我不知道 deflatestream 是否是将能够处理这个。更新了实际问题

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