2009-05-13 11 views
3

私はそれを手に入れません。私は何年も同じようなアプローチを使ってきましたが、これを経験したことはありません。GZipラウンドトリップで1バイト以上の切り捨て

何らかの理由で、今日までGZip往復で1バイト以上が切り捨てられたり、データが文字化けしたりしていました。

私は他の何かがそれに影響していないことを確認する簡単なテストを書いた。

これは常に「長さの不一致」で失敗します。

私は狂っていないと誰かが私に準拠することはできますか? :)

おかげ

leppie

TESTは

using System; 
using System.Diagnostics; 
using System.IO; 
using System.IO.Compression; 

class Program 
{ 
    const int BUFFER_SIZE = 8192; 

    static void Main(string[] args) 
    { 
    var filename = args[0]; 
    var filedata = File.ReadAllBytes(filename); 
    var cmp = Compress(filedata); 
    var dec = Decompress(cmp); 

    Assert(filedata, dec); 

    Console.ReadLine(); 
    } 

    static void Assert(byte[] orig, byte[] data) 
    { 
    if (orig.Length != data.Length) 
    { 
     Debug.Fail("length mismatch"); 
    } 
    for (int i = 0; i < orig.Length; i++) 
    { 
     Debug.Assert(orig[i] == data[i], "data mismatch"); 
    } 
    } 

    static byte[] Compress(byte[] data) 
    { 
    var input = new MemoryStream(data); 
    var output = new MemoryStream(); 

    var s = new GZipStream(output, CompressionMode.Compress); 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    int read = 0; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     s.Write(buffer, 0, read); 
    } 

    return output.ToArray(); 
    } 

    static byte[] Decompress(byte[] data) 
    { 
    var input = new MemoryStream(data); 
    var s = new GZipStream(input, CompressionMode.Decompress); 

    var output = new MemoryStream(); 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    int read = 0; 
    while ((read = s.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, read); 
    } 

    return output.ToArray(); 
    } 
} 

私は別のバッファサイズは、すべて同じ結果で、あまりにも適切にストリームを閉じて、それを試してみました。

答えて

3

OK、問題が見つかりました。

バイトを取得する前に圧縮ストリームを閉じる必要があります。

例:

s.Close(); 
return output.ToArray(); 
関連する問題