我正在尝试解压缩填充在
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();
}
任何帮助将不胜感激。
我尝试按照前面提到的方式解压缩数据,但它给了我前面提到的异常。
您的 Base64 字符串在等号之后的末尾有一个无关的
1
。不知道它是如何到达那里的,但摆脱它。然后 Base-64 解码给出有效的 gzip 流。