【问题标题】:Deflating a stream with SharpZipLib has different behaviors in C# vs. VB.NET使用 SharpZipLib 对流进行放气在 C# 和 VB.NET 中具有不同的行为
【发布时间】:2012-08-24 14:07:58
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

  • 你还没说VB版失败的地方...
  • 我刚刚编辑了我的问题,谢谢。

标签: c# .net vb.net stream sharpziplib


【解决方案1】:

现场游戏的不同之处在于,第一个你使用的是BZip2OutputStream,而第二个是BZip2InputStream

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

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

【讨论】:

  • 对不起,也许这似乎是一个愚蠢的问题,但我真的疯了......非常感谢你让我睁开眼睛!!!
【解决方案2】:

你切换了BZip2OutputStreamBZip2InputStream

【讨论】:

  • 不错的@Chris,比我快 7 秒!
  • 有一个安慰+1无论如何。 ;-)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    相关资源
    最近更新 更多