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

标签 c# php .net compression

我正在查询 c# 4.0 中的网络服务,它为我提供了一个由 php 的 gzcompress() 压缩的字符串.现在我需要在 C# 中解压缩这个字符串。我尝试了几种方法,包括

但每次我都会收到“缺少魔数(Magic Number)”异常。

有人可以给我一些提示吗?

谢谢

编辑 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();
}

最佳答案

好吧,在 @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.
 }

关于c# - 在 c# 中解压由 php 的 gzcompress() 压缩的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4080344/

相关文章:

c# - 如何在不重定向的情况下检索 HTML 页面?

php - NuSOAP:如何更改请求的内容类型?

c# - EF - SqlQuery - 数据读取器中没有相应的同名列

c# - 了解 C# 中的协变和逆变接口(interface)

c# - 字典 KeyCollection 奇怪性

java - 如何使用 Pkcs12 keystore 证书使用 WSDL Web 服务

c# - 使用 dbcontext 的正确方法(全局或作为参数传递?)

php - 从数组中删除键=>值对,但不删除它们

php - 如何获取由cakephp中的updateAll()函数更新的行的id?

.net - 如何模拟强制关闭的 TCP 连接?