Gzip解压缩字符串错误,Gzip头中的幻数不正确
本文关键字:Gzip 不正确 解压缩 字符串 错误 | 更新日期: 2023-09-27 18:15:13
我试图在c#中复制php函数gzuncompress到目前为止,我得到了以下代码的一部分工作。参见下面的注释和代码。
我认为在byte[]和字符串转换期间发生了一些棘手的事情。我该如何解决这个问题?我错过了什么?
我使用的是。net 3.5环境
var plaintext = Console.ReadLine();
Console.WriteLine("string to byte[] then to string");
byte[] buff = Encoding.UTF8.GetBytes(plaintext);
var compress = GZip.GZipCompress(buff);
//Uncompress working below
try
{
var unpressFromByte = GZip.GZipUncompress(compress);
Console.WriteLine("uncompress successful by uncompress byte[]");
}catch
{
Console.WriteLine("uncompress failed by uncompress byte[]");
}
var compressString = Encoding.UTF8.GetString(compress);
Console.WriteLine(compressString);
var compressBuff = Encoding.UTF8.GetBytes(compressString);
Console.WriteLine(Encoding.UTF8.GetString(compressBuff));
//Uncompress not working below by using string
//The magic number in GZip header is not correct
try
{
var uncompressFromString = GZip.GZipUncompress(compressBuff);
Console.WriteLine("uncompress successful by uncompress string");
}
catch
{
Console.WriteLine("uncompress failed by uncompress string");
}
类Gzip的代码
public static class GZip
{
public static byte[] GZipUncompress(byte[] data)
{
using (var input = new MemoryStream(data))
using (var gzip = new GZipStream(input, CompressionMode.Decompress))
using (var output = new MemoryStream())
{
gzip.CopyTo(output);
return output.ToArray();
}
}
public static byte[] GZipCompress(byte[] data)
{
using (var input = new MemoryStream(data))
using (var output = new MemoryStream())
{
using (var gzip = new GZipStream(output, CompressionMode.Compress, true))
{
input.CopyTo(gzip);
}
return output.ToArray();
}
}
public static long CopyTo(this Stream source, Stream destination)
{
var buffer = new byte[2048];
int bytesRead;
long totalBytes = 0;
while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
{
destination.Write(buffer, 0, bytesRead);
totalBytes += bytesRead;
}
return totalBytes;
}
}
这是不合适的:
var compressString = Encoding.UTF8.GetString(compress);
compress
不是一个utf -8编码的文本。您应该将其视为任意二进制数据—不适合传递给Encoding.GetString
。如果您确实需要将任意二进制数据转换为文本,请使用Convert.ToBase64String
(然后反向使用Convert.FromBase64String
):
var compressString = Convert.ToBase64String(compress);
Console.WriteLine(compressString);
var compressBuff = Convert.FromBase64String(compressString);
这可能与PHP所做的匹配,也可能不匹配,但它是一种安全的方式,将任意二进制数据表示为文本,而不像将二进制数据视为有效的utf -8编码文本。
我正在尝试在c#中复制php函数gzuncompress
然后使用。net框架中内置的GZipStream或DeflateStream类。