Распакуйте строку в c #, которая была сжата с помощью php's gzcompress () - PullRequest
10 голосов
/ 02 ноября 2010

Я запрашиваю веб-сервис в c # 4.0, который предоставляет мне строку, сжатую php gzcompress () . Теперь мне нужно распаковать эту строку в C #. Я пробовал несколько способов, включая

но каждый раз я получаю исключение "Пропавшее магическое число".

Может кто-нибудь дать мне несколько подсказок?

Спасибо

Редактировать 1:

Моя последняя попытка:

public static string Decompress(string compressed) {
    byte[] compressedBytes = Encoding.ASCII.GetBytes(compressed);
    MemoryStream mem = new MemoryStream(compressedBytes);
    GZipStream gzip = new GZipStream(mem, CompressionMode.Decompress);
    StreamReader reader = new StreamReader(gzip);
    return reader.ReadToEnd();
}

1 Ответ

11 голосов
/ 02 ноября 2010

Ну, вот и все, с небольшой помощью от @boas.anthro.mnsu.edu:

using (var mem = new MemoryStream())
{
    mem.Write(new byte[] { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0, 8);
    mem.Write(inputBytes, 0, inputBytes.Length);

    mem.Position = 0;

    using (var gzip = new GZipStream(mem, CompressionMode.Decompress))
    using (var reader = new StreamReader(gzip))
    {
        Console.WriteLine(reader.ReadToEnd());
    }
}

Хитрость заключается в добавлении магического заголовка.Обратите внимание, что не работает с SharpZipLib.Жалуется, что нет нижнего колонтитула.Тем не менее, .NET декомпрессор работает отлично.

Еще одна вещь.Комментарий относительно ASCII.GetBytes() правильный: ваш ввод не ASCII.Я добился этого результата с помощью следующего:

// From PHP:

<?php echo base64_encode(gzcompress("Hello world!")); ?>

// In C#:

string input = "eJzzSM3JyVcozy/KSVEEAB0JBF4=";

byte[] inputBytes = Convert.FromBase64String(input);

С дополнительным кодированием и декодированием base64 это работает отлично.

Если вы не можете использовать кодирование base64, вам нужен необработанный поток изстраница PHP.Вы можете получить это, используя GetResponseStream():

 var request = WebRequest.Create("http://localhost/page.php");

 using (var response = request.GetResponse())
 using (var mem = response.GetResponseStream())
 {
     // Decompression code from above.
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...