Gzip распаковывает из-за ошибки строки, неверное магическое число в заголовке GZip - PullRequest
0 голосов
/ 21 ноября 2011

Я пытаюсь скопировать функцию php gzuncompress в C # До сих пор я получил часть следующего кода, работающего.см. комментарий и код ниже.

Я считаю, что хитрый бит происходит во время преобразования байтов [] и строк.Как я могу это исправить?а где я пропустил ??

Я использую среду .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;
        }
}

Ответы [ 2 ]

6 голосов
/ 21 ноября 2011

Это неуместно:

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.

1 голос
/ 21 ноября 2011

Я пытаюсь скопировать php-функцию gzuncompress в C #

Затем использовать GZipStream или DeflateStream классы, встроенные в.NET Framework для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...