원본 압축 데이터를 올바르게 다시 팽창시킬 수 있습니다. 그러나 데이터를 팽창시키고 수축 시키며 다시 팽창 시키면 결과 데이터가 부정확합니다 (예 : 간단한 데이터 추출, 수정 및 다시 압축 - 수정이 테스트되지 않았을 때만 테스트 할 수 있음).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 오류가 아니지만 내 것입니다.