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

qnzebej0  于 2022-11-15  发布在  PHP
关注(0)|答案(6)|浏览(191)

我有一个C#应用程序,它与基于PHP的SOAP Web服务进行通信,以进行更新和许可。
我现在正在开发一个反馈系统,让用户通过软件自动提交错误和跟踪日志。根据我之前发布的一个问题,我觉得Web服务是最好的方法(最有可能在最少的配置下正常工作)。
我目前的想法是使用.NET内置的gzip压缩来压缩文本文件,转换为base64,发送到Web服务,并让PHP脚本转换为二进制并解压缩数据。
PHP可以解压缩用GZipStream压缩的数据吗?如果可以,如何解压缩?

a2mppw5e

a2mppw5e1#

我实际上试过这个。GZipStream不工作。另一方面,在.NET端用DeflateStream压缩,在PHP端用gzinflate解压缩。你的里程可能会有所不同...

sr4lhrrt

sr4lhrrt2#

如果http级别的库实现了它(客户端和服务器端),http支持gzip压缩,在这种情况下没有理由手动压缩任何东西。在你进一步尝试之前,你应该检查一下是否已经这样做了。

cnh2zyt3

cnh2zyt33#

由于服务器正在接受Web请求,因此您确实应该检查HTTP头以确定是否有任何客户端接受GZIP编码,而不是每次都猜测和gzip。
如果PHP客户端可以执行gzip,那么我将设置头文件,然后您的代码将据此做出React并执行正确的操作。当您的代码提供了了解客户端功能的工具时,假设或猜测是一个糟糕的选择。

bxpogfeg

bxpogfeg4#

我最近写了一篇文章,展示了如何在C#中进行压缩/解压缩。我几乎在相同的场景中使用了它。我想将日志文件从客户端传输到服务器,它们通常很大。然而,在我的情况下,我的Web服务运行在.NET中,因此我可以使用解压缩方法。但看起来PHP确实支持一个名为gzdecode的方法,该方法可以工作。
http://coding.infoconex.com/post/2009/05/Compress-and-Decompress-using-net-framework-and-built-in-GZipStream.aspx

yrefmtwq

yrefmtwq5#

是的,PHP可以解压缩GZIP压缩的字符串,不管有没有标头。

  • gzdecode用于GZIP文件格式(即与gzip兼容)
  • gzinflate表示“原始”放气格式
  • gzuncompress,用于ZLIB格式(GZIP格式,不带某些头信息)

我不知道你会想要哪一种,因为我不熟悉.NET GZipStream。它听起来有点像gzuncompress,因为ZLIB格式是一种“流”格式,但是请尝试所有三种格式。

y3bcpkx1

y3bcpkx16#

我能够在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编码的压缩字符串,对于Hi!!输入,该字符串为H4sIAAAAAAAEAPPIVFQEANxaFPgEAAAA
下面是在PHP中解压缩的代码:

echo gzdecode(base64_decode('H4sIAAAAAAAEAPPIVFQEANxaFPgEAAAA'));

相关问题