用php'对c#中的字符串进行解压缩;s gzcompress()

用php'对c#中的字符串进行解压缩;s gzcompress(),c#,php,.net,compression,C#,Php,.net,Compression,我正在查询c#4.0中的一个Web服务,它为我提供了一个由php压缩的字符串。现在我需要用c#解压这个字符串。我尝试了几种方法,包括 但每次我都会得到一个“失踪的魔法数字”例外 有人能给我一些提示吗 多谢各位 编辑1: 我的最新尝试: public static string Decompress(string compressed) { byte[] compressedBytes = Encoding.ASCII.GetBytes(compressed); Memo

我正在查询c#4.0中的一个Web服务,它为我提供了一个由php压缩的字符串。现在我需要用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();
}

好了,就这样,在以下方面的帮助下:

诀窍是添加一个魔术头。请注意,此对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);

我想扩展彼得的回答。 PHP也可以使用Deflate算法进行压缩。在这种情况下,您应该使用DeflateStream而不是GZipStream,并删除前2个字节(十六进制:78 9C)


代码,代码,代码。。。还有更多的代码。无法修复我们看不到的内容。这是公共Web服务还是您自己的?您确定Web服务的输出是正确的吗?您是否使用php对脚本的输出进行了解压缩测试?您做错了。PHP的gzcompress不返回ASCII字符串。这不是问题所在。用正确的方式(我已经用PHP对其进行base64编码,并用C#对其进行解码)确实没有帮助,使用
gzencode
代替
gzcompress
将生成具有正确GZIP页眉和页脚的输出,而不是让您在C#端伪造它。遗憾的是,我无法控制PHP端。ASCII.GetBytes()还可以吗?不可以。问题是,您从PHP页面的某个地方获取数据。我相信你已经明白了。这是不正确的,您应该将其作为
字节[]
(内存)流来获取。我在答案中加了一个例子。如果您不知道如何做到这一点,并且示例还不够,请将用于读取PHP页面的代码添加到文章中,我将给出如何更改的建议。
// From PHP:

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

// In C#:

string input = "eJzzSM3JyVcozy/KSVEEAB0JBF4=";

byte[] inputBytes = Convert.FromBase64String(input);
 var request = WebRequest.Create("http://localhost/page.php");

 using (var response = request.GetResponse())
 using (var mem = response.GetResponseStream())
 {
     // Decompression code from above.
 }
 private static byte[] Decompress(byte[] data)
{
  using (var compressedStream = new MemoryStream(data.Skip(2).ToArray()))
  using (var zipStream = new DeflateStream(compressedStream, CompressionMode.Decompress))
  using (var resultStream = new MemoryStream())
  {
    zipStream.CopyTo(resultStream);
    return resultStream.ToArray();
  }
}