1

我在编写静态 Deflate 扩展方法时遇到了麻烦,我将使用 SharpZipLib 库的 BZip2 算法(运行时版本:v2.0.50727)来对字符串进行放气。

我正在使用 .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 版本中,我收到此错误:“流不支持读取。” (查看代码以了解它的来源!)

哪里错了?!!我不明白这两种方法有什么区别......

非常感谢你!

4

3 回答 3

4

现场游戏的差异表明,在第一个中您使用的是,BZip2OutputStream而第二个是BZip2InputStream

输出流用于写入似乎是合理的,因此它说它是不可读的。

对于它的价值,那里有很多很好的比较工具。它们不会处理不同的语法,但是当您使用完全不同的对象时(至少在这种情况下),匹配的工作方式会很好地显示出来。我个人使用和推荐的是Beyond Compare

于 2012-08-24T14:17:26.093 回答
2

你切换BZip2OutputStreamBZip2InputStream

于 2012-08-24T14:17:32.860 回答
1

在一个版本中,您使用的是 a BZip2InputStream,而在另一个版本中是 a BZip2OutputStream

于 2012-08-24T14:17:41.467 回答