用php'对c#中的字符串进行解压缩;s gzcompress()
我正在查询c#4.0中的一个Web服务,它为我提供了一个由php压缩的字符串。现在我需要用c#解压这个字符串。我尝试了几种方法,包括用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
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();
}
}