我试图读取压缩的二进制.x网格文件,但我的解压缩失败了。该文件基本上是一些directx头信息,然后是MSZIP格式的一堆数据(即2个字节是一个int blockSize
,2个字节是"幻数"然后有{{1缩小字节,然后重复,直到没有更多数据)所以对于每个块,我只是得到压缩字节并像这样放气 -
blockSize
第一个块按预期放气。后续的块是正确的膨胀大小,但是,似乎是随机的,当它们不应该是的时候,一些字节是0,通常是4-12的组。
如何在保持相同历史记录缓冲区的同时缩小不同的压缩数据块?
更新:经过一些研究后,看起来在MSZIP压缩中,这些块是单独的收缩操作的结果,但是"历史缓冲区"在他们之间保持着我不知道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 :(得分:3)
是的,有些东西你不见了。每个deflate块可以并且确实使用来自先前deflate块的历史记录。因此,在每个块中,您必须使用前一个块中的最后32K未压缩数据初始化deflate字典。