2012-02-08 30 views
0

私はいくつかのDeflateCodedデータを解凍したいと思います。 残念ながら、私はいつも「デコード中に無効なデータが見つかりました」という例外があります。 しかし、データは有効です。C#decode(decompress)PDFファイルのデータを圧縮します。

private void Decompress() 
{ 
    FileStream fs = new FileStream(@"S:\Temp\myFile.bin", FileMode.Open); 

    //First two bytes are irrelevant 
    fs.ReadByte(); 
    fs.ReadByte(); 

    DeflateStream d_Stream = new DeflateStream(fs, CompressionMode.Decompress); 

    StreamToFile(d_Stream, @"S:\Temp\myFile1.txt", FileMode.OpenOrCreate); 

    d_Stream.Close(); 
    fs.Close(); 
} 

private static void StreamToFile(Stream inputStream, string outputFile, FileMode fileMode) 
{ 
    if (inputStream == null) 
     throw new ArgumentNullException("inputStream"); 

    if (String.IsNullOrEmpty(outputFile)) 
     throw new ArgumentException("Argument null or empty.", "outputFile"); 

    using (FileStream outputStream = new FileStream(outputFile, fileMode, FileAccess.Write)) 
    { 
     int cnt = 0; 
     const int LEN = 4096; 
     byte[] buffer = new byte[LEN]; 

     while ((cnt = inputStream.Read(buffer, 0, LEN)) != 0) 
      outputStream.Write(buffer, 0, cnt); 
    } 
} 

アイデアはありますか?おかげさまで

+0

なぜ最初の2バイトは無関係ですか? –

+1

ストリームデコーダはRFC1951を使用しています。 DeflateStreamsと組み合わせて、最初の2バイトは無関係です。 ストリームデコーダがRC1950を使用している場合は、最初のバイトも使用する必要があります。 – user1011394

+2

エラーが間違っていて、データが実際に有効であることを証明するために何をしましたか? –

答えて

2

私は、テストデータのためにこれを追加しました: -

private static void Compress() 
{ 
    FileStream fs = new FileStream(@"C:\Temp\myFile.bin", FileMode.Create); 

    DeflateStream d_Stream = new DeflateStream(fs, CompressionMode.Compress); 
    for (byte n = 0; n < 255; n++) 
    d_Stream.WriteByte(n); 
    d_Stream.Close(); 
    fs.Close(); 
} 

次のように解凍を修正: -

private static void Decompress() 
{ 
    FileStream fs = new FileStream(@"C:\Temp\myFile.bin", FileMode.Open); 

    //First two bytes are irrelevant 
    //  fs.ReadByte(); 
    //  fs.ReadByte(); 

    DeflateStream d_Stream = new DeflateStream(fs, CompressionMode.Decompress); 

    StreamToFile(d_Stream, @"C:\Temp\myFile1.txt", FileMode.OpenOrCreate); 

    d_Stream.Close(); 
    fs.Close(); 
} 

このようにそれを蘭: -

し、エラーを得ませんでした。

最初の2バイトのいずれかが関連していることは明らかです(明らかに私の特定のテストデータが入っています)。または データに問題があります。

再生するテストデータをいくつか用意できますか?

(明らかに機密扱いしないでください)

関連する問題