PHP 可以解压使用 .NET GZipStream 类压缩的文件吗?

问题描述 投票:0回答:6

我有一个 C# 应用程序,它与基于 PHP 的 SOAP Web 服务进行通信以进行更新和许可。

我现在正在开发一个反馈系统,供用户通过软件自动提交错误和跟踪日志。 根据我之前发布的问题,我认为 Web 服务将是最好的方法(最有可能以最少的配置正常工作)。

我目前的想法是使用.NET内置的gzip压缩来压缩文本文件,转换为base64,发送到Web服务,并将PHP脚本转换为二进制并解压缩数据。

PHP 可以解压使用 GZipStream 压缩的数据吗?如果可以,如何解压?

c# php web-services compression gzip
6个回答
8
投票

我实际上尝试过这个。 GZipStream 不起作用。另一方面,在 .NET 端使用 DeflateStream 进行压缩并在 PHP 端使用 gzinflate 进行解压是可行的。您的里程可能会有所不同...


1
投票

如果 http 级库实现了它(客户端和服务器),http 支持 gzip 压缩,在这种情况下,就没有理由手动压缩任何内容。在您进一步冒险之前,您应该检查这种情况是否已经发生。


1
投票

是的,PHP 可以解压 GZIP 压缩字符串。 作为参考,以下是 PHP 中主要的三种 gz 解压工具之间的区别:

  • gzdecode 适用于 GZIP 文件格式(带有 GZIP 页眉和页脚的 DEFLATE)
  • gzinflate 用于原始 DEFLATE 格式
  • gzuncompress 适用于 ZLIB 格式(使用较小的 ZLIB 页眉和页脚 DEFLATE)

由于您想以 GZIP 格式解压缩数据,因此使用

gzdecode


0
投票

由于服务器正在接受 Web 请求,因此您确实应该检查 HTTP 标头以确定是否有客户端接受 GZIP 编码,而不是每次都猜测和 gzip 压缩。

如果 PHP 客户端可以执行 gzip,它将设置标头,然后您的代码将做出相应反应并执行正确的操作。当为您的代码提供了解客户端功能的工具时,假设或猜测是一个糟糕的选择。


0
投票

我最近发布了一篇文章,展示了如何在 C# 中压缩/解压缩。我将它用于几乎相同的场景。我想将日志文件从客户端传输到服务器,它们通常非常大。然而,就我而言,我的 Web 服务在 .NET 中运行,因此我可以使用解压缩方法。但看起来 PHP 确实支持一种名为 gzdecode 的方法,该方法可以工作。

http://coding.infoconex.com/post/2009/05/compress-and-Decompress-using-net-framework-and-built-in-GZipStream.aspx


0
投票

我能够在 C# 和 PHP 上使用 Gzip 进行演示。

C# 中的 Gzip 压缩:

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

public class Program {
    public static void Main() {
        string s = "Hi!!";

        byte[] byteArray = Encoding.UTF8.GetBytes(s);
        byte[] b2 = Compress(byteArray);

        Console.WriteLine(System.Convert.ToBase64String(b2));
    }

    public static byte[] Compress(byte[] bytes) {
        using (var memoryStream = new MemoryStream()) {
            using (var gzipStream = new GZipStream(memoryStream, CompressionLevel.Optimal)) {
                gzipStream.Write(bytes, 0, bytes.Length);
            }
            return memoryStream.ToArray();
        }
    }

    public static byte[] Decompress(byte[] bytes) {
        using (var memoryStream = new MemoryStream(bytes)) {

            using (var outputStream = new MemoryStream()) {
                using (var decompressStream = new GZipStream(memoryStream, CompressionMode.Decompress)) {
                    decompressStream.CopyTo(outputStream);
                }
                return outputStream.ToArray();
            }
        }
    }
}

上面的代码打印了 base64 编码的压缩字符串,对于

H4sIAAAAAAAEAPPIVFQEANxaFPgEAAAA
输入来说是
Hi!!

这是 PHP 中解压的代码:

echo gzdecode(base64_decode('H4sIAAAAAAAEAPPIVFQEANxaFPgEAAAA'));
© www.soinside.com 2019 - 2024. All rights reserved.