解压缩压缩数据

问题描述 投票:0回答:1

我正在尝试解压缩填充在

List<string>
中的一些压缩数据。这是我的解压方法:

static string Decompress(string inputStr)
{
    StringBuilder result = new StringBuilder();
    string decompressedString = string.Empty;
    byte[] compressedBytes = new byte[0];

    try
    {
        compressedBytes = Convert.FromBase64String(inputStr);
    }
    catch
    {
        failedDecompressionCnt++;
    }
    
    using (var compressedStream = new MemoryStream(compressedBytes))
    using (var decompressedStream = new MemoryStream())
    using (var gzip = new GZipStream(compressedStream, CompressionMode.Decompress))
    {
        byte[] buffer = new byte[4096];
        int read;
        while ((read = gzip.Read(buffer, 0, buffer.Length)) > 0)
        {
            decompressedStream.Write(buffer, 0, read);
        }

        byte[] decompressedBytes = decompressedStream.ToArray();
        decompressedString = Encoding.UTF8.GetString(decompressedBytes);
    }
    result.Append(decompressedString);
    return result.ToString();
}

我在

try
块中的这一行放置了一个断点:

compressedBytes = Convert.FromBase64String(inputStr);

并且

catch
块被执行用于以下
inputStr

H4sIAAAAAAAACr1TXU/CMBR9xsT/0Oyd9Y5lhJEyQoaJJIKLEkx8q6xIwz5I2xn993YtmRuKDz74eE/PvTn33FMyfc8z9MaE5GUxcTwXHMSKbZny4nXiVGrX94bONLq+ImsmVcyE4ju+pYppqGewByarTMm6tsD9kQmq9DgD9ciK5iy65SgpFcGmsHhChS4UE7Y+EReFHmfakZ7MpaLFliGv3dkjseC6j9PIA1giqhC4AcBhQ3DzcmJuaFaxaBhCsETlPifYAlYBPpNwQdIsRk9c7WspKao3vCAGfBcgn9V6tI+/6QHPHY2Qpv5Jz88WDf7HInvuKKFSspTgU2mOj79d30KthJiALIpdKfKviBDbUwqjvziUkhdU7TnBnQdDXSiWx2XKomc/gD54gU5GgxnGY71btqryF625xergTVjXH0cW3d3MkVSCH5Ey120eGtq8TvwABj4GD0OIIBz74RgAJUtLNwS7jP5MNMvOfOqijTVdKyzW/mSfVCx3kZ8DAAA=1

我在

Decompress
方法中的这一行遇到异常:
byte[] compressedBytes = Convert.FromBase64String(inputStr);

例外情况如下:

System.FormatException:“输入不是有效的 Base-64 字符串,因为它包含非 Base 64 字符、两个以上的填充字符或填充字符中的非法字符。”

我正在迭代压缩数据列表,并将每个条目逐一传递给我的

Decompress
方法,大多数压缩数据已正确解压缩,我没有收到此错误。我只在某些压缩数据上收到此错误。我不明白只有当我以相同的方式压缩所有数据时,这对于某些压缩数据来说才可能。在大约 52000 个条目的列表中,除了上面提到的例外情况外,我得到了大约 1500 次失败的解压。

我仍然是一个相对新手,我想了解如果所有数据都以相同的方式压缩,如何正确解压缩大部分数据?

为了一些额外的上下文,我将数据压缩如下:

static string Compress(string inputStr, long cnt)
{
    StringBuilder result = new StringBuilder();
    byte[] inputStrBytes = Encoding.UTF8.GetBytes(inputStr);
    using (var stream = new MemoryStream())
    using (var gzip = new GZipStream(stream, CompressionMode.Compress))
    {
        gzip.Write(inputStrBytes, 0, inputStrBytes.Length);
        gzip.Close();

        byte[] compressed = stream.ToArray();
        result.Append(Convert.ToBase64String(compressed));
        Console.WriteLine(cnt);
    }
    return result.ToString();
}

任何帮助将不胜感激。

我尝试按照前面提到的方式解压缩数据,但它给了我前面提到的异常。

c# base64 compression
1个回答
0
投票

您的 Base64 字符串在等号之后的末尾有一个无关的

1
。不知道它是如何到达那里的,但摆脱它。然后 Base-64 解码给出有效的 gzip 流。

© www.soinside.com 2019 - 2024. All rights reserved.