在c#中解压缩由php的gzcompress()压缩的字符串

Kit*_*Kat 10 .net php c# compression

我在c#4.0中查询一个web服务,它为我提供了一个由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();
}
Run Code Online (Sandbox Code Playgroud)

Pie*_*kel 11

那么,你可以在@ 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

诀窍是添加一个魔术头.请注意,这不适用于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);
Run Code Online (Sandbox Code Playgroud)

通过额外的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.
 }
Run Code Online (Sandbox Code Playgroud)