圧縮されたバイナリ.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圧縮のように見えますが、これらのブロックは個別のデフレート操作の結果ですが、「履歴バッファ」はそれらの間で維持されます。がこれを処理できるかどうかわかりません。実際の質問を更新しました
ありがとうございます!私は質問を更新する前にこれを見ていませんでした。私はあなたがC#でこれを行う方法を知っているとは思わない? –
Deflateクラスがzlibの 'deflateSetDictionary()'関数へのアクセスを提供するようには見えません。 zlibを直接使用する必要があります。 –
実際、zlibを直接使用している場合は、この目的のために追加したドキュメント化されていない 'deflateResetKeep()'関数を使用することができます。それは新しい水蒸気流を開始するが、その状態を使用して完了したばかりの水蒸気から辞書を保持する。対応する 'inflateResetKeep()'もあります。 –