2016-09-08 4 views
2

圧縮されたバイナリ.xメッシュファイルを読み込もうとしていますが、圧縮解除に失敗しています。ファイルは基本的にいくつかのダイレクトヘッダー情報であり、次にMSZIP形式のデータの束です(つまり、2バイトはint blockSizeです.2バイトは "マジックナンバー"です。そして、blockSizeの圧縮されたバイトがあり、ので、各ブロックのために私は圧縮されたバイトを取得していますし、期待通りに最初のブロックが収縮SO-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ではありません。通常は4〜12のグループになります。

同じ履歴バッファを維持しながら、異なるブロックの圧縮データを収縮させる方法はありますか?

更新:もう少し研究を重ねると、MSZIP圧縮のように見えますが、これらのブロックは個別のデフレート操作の結果ですが、「履歴バッファ」はそれらの間で維持されます。​​がこれを処理できるかどうかわかりません。実際の質問を更新しました

答えて

3

はい、あなたが欠けているものがあります。各deflateブロックは、以前のdeflateブロックの履歴を使用できます。したがって、各ブロックで、前のブロックの圧縮されていないデータの最後の32Kを使用して、収縮辞書を初期化する必要があります。

+0

ありがとうございます!私は質問を更新する前にこれを見ていませんでした。私はあなたがC#でこれを行う方法を知っているとは思わない? –

+0

Deflateクラスがzlibの 'deflateSetDictionary()'関数へのアクセスを提供するようには見えません。 zlibを直接使用する必要があります。 –

+0

実際、zlibを直接使用している場合は、この目的のために追加したドキュメント化されていない 'deflateResetKeep()'関数を使用することができます。それは新しい水蒸気流を開始するが、その状態を使用して完了したばかりの水蒸気から辞書を保持する。対応する 'inflateResetKeep()'もあります。 –

関連する問題