2012-08-24 2 views
1

SharpZipLib 라이브러리의 BZip2 alghorithm (런타임 버전)을 사용하여 문자열을 수축시키는 데 사용할 정적 Deflate 확장 메서드를 작성하는 데 문제가 있습니다. : v2.0.50727). 나는이 내 VB.NET 코드입니다 .NET 프레임 워크 4SharpZipLib로 스트림을 수축시키는 것은 C#과 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

입니다 당신은 당신이 BZip2InputStream를 사용하고 BZip2OutputStream 다른에 하나 개 버전 BZip2OutputStreamBZip2InputStream

+0

좋은 크리스티안, 7 초 만만 쳐봐! – tcarvin

+0

위안을 얻으세요. anywya. ;-) – Chris

+0

2 ... 당신이 정말로 빨랐 기 때문에! :) 고맙습니다. 다시 .. – MAXE

1

투입합니다.

관련 문제