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 버전에서 "스트림이 읽기를 지원하지 않습니다."라는 오류 메시지가 나타납니다. (어디서 왔는지 이해하는 코드를 참조하십시오)
어디서 실수입니까? !! 두 가지 방법의 차이점을 이해할 수 없습니다 ...
대단히 고마워요!
VB 버전에서 어떤 문제가 발생하지 않았는지 ... –
지금 제 질문을 편집했습니다. – MAXE