从MSZIP格式中清除数据

时间:2016-09-08 11:58:09

标签: zip compression deflate deflatestream

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

blockSize

第一个块按预期放气。后续的块是正确的膨胀大小,但是,似乎是随机的,当它们不应该是的时候,一些字节是0,通常是4-12的组。

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

更新:经过一些研究后,看起来在MSZIP压缩中,这些块是单独的收缩操作的结果,但是&#34;历史缓冲区&#34;在他们之间保持着我不知道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(); } 是否能够处理这个问题。更新了实际问题

1 个答案:

答案 0 :(得分:3)

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