2009-06-22 59 views
1

私はGzipをサーバー上に作成し、WebClientクラスを使用してクライアントにダウンロードします。解凍しようとすると、Magic Numberが見つからないというエラーメッセージが表示されます。私はGZipStreamクラスとこれを解決するICSharpLibメソッドの両方を試したので、私は迷っています。Gzipのマジックナンバーを解決する方法がありません

WebClient経由でダウンロードするステップ(DownloadDataを使用してデータをバイト[]として返す)を省略すると、圧縮/解凍が機能するため、データが切り捨てられたり破損したりするという問題があると仮定できますどのように圧縮されたデータなので、これをデバッグする方法がわかりません。ここで

は、問題のある部分であるように思わコードスニペットです:

byte[] response 
    try { 
     response = client.DownloadData(Constants.GetSetting("SyncServer")); 
    } catch { 
     MessageBox.Show("There was a problem synchronizing the data. Please try verify the supplied credentials or try again later.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return; 
    } 

    int rows = SQLiteAPI.ImportStatHistoryXML(CurrentUser.User, myCampus, Convert.ToBase64String(response)); 

public static int ImportStatHistoryXML(Person tempPerson, Campus tempCampus, string xmlFile) { 
      byte[] encryptedFile = Convert.FromBase64String(xmlFile); 
      MemoryStream memStream = new MemoryStream(encryptedFile); 
      memStream.ReadByte(); 
      GZipInputStream stream = new GZipInputStream(memStream); 
      MemoryStream memory = new MemoryStream(); 
      byte[] writeData = new byte[4096]; 
      int size; 

      while (true) { 
       size = stream.Read(writeData, 0, writeData.Length); 
       if (size > 0) { 
        memory.Write(writeData, 0, size); 
       } else { 
        break; 
       } 
      } 
      stream.Close(); 
      memory.Position = 0; 
      StreamReader sr = new StreamReader(memory); 
      string decompressed = sr.ReadToEnd(); 
      DataSet tempSet = new DataSet(); 
      StringReader xmlReader = new StringReader(decompressed); 
      tempSet.ReadXml(xmlReader); 
      DataTable statTable = tempSet.Tables["Stats"]; 
...more unrelated processing of the table 
} 

任意の助けをいただければ幸いです。 P.S.私は、Base64文字列を使ってウェブを行き来することができます。これは実際には、デスクトップアプリとWebサービスの間でWebリクエストや応答を行っていないので、私が戸惑っている部分です。

答えて

5

まず、スニペットが有効であるとは限りません。なぜなら、DownloadStringは(期待通りに)Stringを返すからです。

ここで、DownloadDataを使用すると正しく動作し、DownloadStringを使用すると間違って正しく動作することを理解できますか? UnicodeとしてGzipデータをデコードすることは有効ではないため、意味があります。

EDIT:

さて、ToBase64StringとFromBase64Stringは大丈夫でなければなりません。しかし、それを避けてバイト[]を直接渡すことができれば、それは良いでしょう。

次に、関数の最初の行(base64からのデコード)を取り除きます。 encryptedFileをcompressedFileに変更しています。

ライン:

memStream.ReadByte(); 

があってはなりません。あなたはバイトを読んでそれを破棄しています。バイトが0x1Fであると予想されるすべてがあれば、gzipマジックナンバーの一部です。

次に、誤ったgzipクラスを使用していると思います。あなたはGZipStreamが必要です。あなたはその上で直接のStreamReaderを使用し、その後

GZipStream stream = new GZipStream(memStream, CompressionMode.Decompress); 

StreamReader sr = new StreamReader(stream); 

あなたはエンコーディングを知っていた場合、それが役立つだろう、うまくいけばデフォルトが正しいだろう同様に構成されています。それから、それは正しいようです。だから全体的に我々は以下のようになる。

public static int ImportStatHistoryXML(Person tempPerson, Campus tempCampus, byte[] compressedFile) { 
    MemoryStream memStream = new MemoryStream(compressedFile); 
    GZipStream gzStream = new GZipStream(memStream, CompressionMode.Decompress); 
    StreamReader sr = new StreamReader(gzStream); 
    string decompressed = sr.ReadToEnd(); 
    DataSet tempSet = new DataSet(); 
    StringReader xmlReader = new StringReader(decompressed); 
    tempSet.ReadXml(xmlReader); 
    DataTable statTable = tempSet.Tables["Stats"]; 

    //... 
} 
+0

あなたはそうです。申し訳ありませんが、私が欠けていたものを整えることができるかどうかを確認する最後の溝の努力を試みていました。 – Jared

+0

ありがとうございます。コードはもっと理にかなっていますが、私の質問には答えられませんでした。 –

+0

私はbase64エンコードされた文字列を持っていますか?それはうまくいかないでしょうか?どのようにGzip'edデータをWebサービスとの間でやりとりしますか? – Jared

関連する問題