【问题标题】:Gzip uncompress from string error, The magic number in GZip header is not correctGzip 从字符串错误中解压,GZip 标头中的幻数不正确
【发布时间】:2011-11-21 07:35:50
【问题描述】:

我正在尝试在 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;
        }
}

【问题讨论】:

    标签: c# php .net gzip


    【解决方案1】:

    这是不恰当的:

    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 编码文本不同。

    【讨论】:

    • 非常感谢,完全没想到。它奏效了
    【解决方案2】:

    我正在尝试在 C# 中复制 php 函数 gzuncompress

    然后使用 .NET 框架中内置的 GZipStreamDeflateStream 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多