2

我正在尝试读取压缩的二进制 .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能够处理这个问题。更新了实际问题

4

1 回答 1

4

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

于 2016-09-08T13:39:34.517 回答