元の圧縮データを正しく元に戻すことができます。しかし、データを膨らませて収縮させ、再び膨張させると、データが不正確になります(単純なデータ抽出、その変更、再圧縮など - テストが行われていない場合にのみテストできます)。SharpZipLib Deflaterが不良データを作成します
結果データが何らかの形で「破損」しています。開始(約)40バイトはOKで、その後、不正なデータの「ブロック」が続きます(元のデータの残りはまだありますが、多くのバイトが欠落しています)。
圧縮レベルを変更しても効果がありません(NO_COMPRESSIONを設定すると、何とか不完全なストリームが作成されます)。
質問は簡単です:なぜそれが起こっているのですか?
using ICSharpCode.SharpZipLib.Zip.Compression;
public byte[] Inflate(byte[] inputData)
{
Inflater inflater = new Inflater(false);
using (var inputStream = new MemoryStream(inputData))
using (var ms = new MemoryStream())
{
var inputBuffer = new byte[4096];
var outputBuffer = new byte[4096];
while (inputStream.Position < inputData.Length)
{
var read = inputStream.Read(inputBuffer, 0, inputBuffer.Length);
inflater.SetInput(inputBuffer, 0, read);
while (inflater.IsNeedingInput == false)
{
var written = inflater.Inflate(outputBuffer, 0, outputBuffer.Length);
if (written == 0)
break;
ms.Write(outputBuffer, 0, written);
}
if (inflater.IsFinished == true)
break;
}
inflater.Reset();
return ms.ToArray();
}
}
public byte[] Deflate(byte[] inputData)
{
Deflater deflater = new Deflater(Deflater.BEST_SPEED, false);
deflater.SetInput(inputData);
deflater.Finish();
using (var ms = new MemoryStream())
{
var outputBuffer = new byte[65536 * 4];
while (deflater.IsNeedingInput == false)
{
var read = deflater.Deflate(outputBuffer);
ms.Write(outputBuffer, 0, read);
if (deflater.IsFinished == true)
break;
}
deflater.Reset();
return ms.ToArray();
}
}
編集:私の悪いことに、間違って元の圧縮データの最初の数バイトを書き換えました。これはSharpZipLibフォルトではありませんが、私のものです。