2012-08-24 24 views
1

我在編寫一個靜態的Deflate擴展方法時遇到麻煩,我會用它來解壓一個字符串,使用SharpZipLib庫的BZip2 alghorithm(運行時版本:v2.0.50727)。用SharpZipLib縮小流在C#與VB.NET中有不同的行爲

我使用.NET框架4.

這是我的VB.NET代碼做:

Public Function Deflate(ByVal text As String) 
    Try 
     Dim compressedData As Byte() = Convert.FromBase64String(text) 

     System.Diagnostics.Debug.WriteLine(String.Concat("Compressed text data size: ", text.Length.ToString())) 
     System.Diagnostics.Debug.WriteLine(String.Concat("Compressed byte data size: ", compressedData.Length.ToString())) 

     Using compressedStream As MemoryStream = New MemoryStream(compressedData) 
      Using decompressionStream As BZip2OutputStream = New BZip2OutputStream(compressedStream) 
       Dim cleanData() As Byte 

       Using decompressedStream As MemoryStream = New MemoryStream() 
        decompressionStream.CopyTo(decompressedStream) // HERE THE ERROR! 

        cleanData = decompressedStream.ToArray() 
       End Using 

       decompressionStream.Close() 
       compressedStream.Close() 

       Dim cleanText As String = Encoding.UTF8.GetString(cleanData, 0, cleanData.Length) 

       System.Diagnostics.Debug.WriteLine(String.Concat("After decompression text data size: ", cleanText.Length.ToString())) 
       System.Diagnostics.Debug.WriteLine(String.Concat("After decompression byte data size: ", cleanData.Length.ToString())) 

       Return cleanText 
      End Using 
     End Using 
    Catch 
     Return String.Empty 
    End Try 
End Function 

奇怪的是,我寫的同一方法的C#對應,並它完美的作品!這是代碼:

public static string Deflate(this string text) 
{ 
     try 
     { 

      byte[] compressedData = Convert.FromBase64String(text); 

      System.Diagnostics.Debug.WriteLine(String.Concat("Compressed text data size: ", text.Length.ToString())); 
      System.Diagnostics.Debug.WriteLine(String.Concat("Compressed byte data size: ", compressedData.Length.ToString())); 

      using (MemoryStream compressedStream = new MemoryStream(compressedData)) 
      using (BZip2InputStream decompressionStream = new BZip2InputStream(compressedStream)) 
      { 
       byte[] cleanData; 

       using (MemoryStream decompressedStream = new MemoryStream()) 
       { 
        decompressionStream.CopyTo(decompressedStream); 

        cleanData = decompressedStream.ToArray(); 
       } 

       decompressionStream.Close(); 
       compressedStream.Close(); 

       string cleanText = Encoding.UTF8.GetString(cleanData, 0, cleanData.Length); 

       System.Diagnostics.Debug.WriteLine(String.Concat("After decompression text data size: ", cleanText.Length.ToString())); 
       System.Diagnostics.Debug.WriteLine(String.Concat("After decompression byte data size: ", cleanData.Length.ToString())); 

       return cleanText; 
      } 

     } 
     catch(Exception e) 
     { 
      return String.Empty; 
     } 
} 

在VB.NET版本中,我收到此錯誤:「流不支持讀取。」 (看代碼瞭解它在哪裏!)

哪裏出錯?我不明白這兩種方法有什麼區別...

非常感謝!

+2

你還沒有說過在VB版本中失敗了什麼...... –

+0

我剛剛編輯了我的問題,謝謝。 – MAXE

回答

4

現貨差異的博弈顯示,在第一個使用BZip2OutputStream而第二個是BZip2InputStream

這似乎是合理的,輸出流用於寫入,因此它說不可讀。

爲什麼它的價值有很多很好的比較工具。他們不會處理不同的語法,但是當你使用完全不同的對象時(至少在這種情況下),匹配的方式顯示得非常好。一個我個人使用和推薦是Beyond Compare

+0

對不起,也許它可能看起來是一個愚蠢的問題,但我真的很瘋狂......非常感謝你讓我睜開眼睛! – MAXE

2

您切換BZip2OutputStreamBZip2InputStream

+0

好@ @克里斯,打我7秒! – tcarvin

+0

有一個安慰+1 anywya。 ;-) – Chris

+0

兩個......因爲你們都很快! :)再次Thanx .. – MAXE

1

在一個版本您使用的是BZip2InputStream和另外一個BZip2OutputStream

相關問題