1

SharpZipLib ライブラリ (ランタイム バージョン: v2.0.50727) の BZip2 アルゴリズムを使用して、文字列を圧縮するために使用する静的な Deflate 拡張メソッドを作成する際に問題があります。

.NET Framework 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つの方法の違いがわかりません...

どうもありがとうございました!

4

3 に答える 3

4

違いを見つけるゲームは、最初に使用してBZip2OutputStreamいるのに対し、2 番目に使用していることを示していますBZip2InputStream

出力ストリームが書き込みに使用されることは合理的であるように思われるため、それが言うように読み取り不能です。

その価値のために、優れた比較ツールがたくさんあります。それらは異なる構文には対応しませんが、完全に異なるオブジェクトを使用している場合 (少なくともこの場合) は、マッチングの動作が非常にうまく表示されます。私が個人的に使用して推奨するのはBeyond Compareです

于 2012-08-24T14:17:26.093 に答える
2

あなたが切り替えBZip2OutputStreamBZip2InputStream

于 2012-08-24T14:17:32.860 に答える
1

1 つのバージョンでは を使用し、もう 1 つのバージョンBZip2InputStreamではBZip2OutputStream.

于 2012-08-24T14:17:41.467 に答える