我有一个 C# 应用程序,它与基于 PHP 的 SOAP Web 服务进行通信以进行更新和许可。
我现在正在开发一个反馈系统,供用户通过软件自动提交错误和跟踪日志。 根据我之前发布的问题,我认为 Web 服务将是最好的方法(最有可能以最少的配置正常工作)。
我目前的想法是使用.NET内置的gzip压缩来压缩文本文件,转换为base64,发送到Web服务,并将PHP脚本转换为二进制并解压缩数据。
PHP 可以解压使用 GZipStream 压缩的数据吗?如果可以,如何解压?
我实际上尝试过这个。 GZipStream 不起作用。另一方面,在 .NET 端使用 DeflateStream 进行压缩并在 PHP 端使用 gzinflate 进行解压是可行的。您的里程可能会有所不同...
如果 http 级库实现了它(客户端和服务器),http 支持 gzip 压缩,在这种情况下,就没有理由手动压缩任何内容。在您进一步冒险之前,您应该检查这种情况是否已经发生。
是的,PHP 可以解压 GZIP 压缩字符串。 作为参考,以下是 PHP 中主要的三种 gz 解压工具之间的区别:
由于您想以 GZIP 格式解压缩数据,因此使用
gzdecode
。
由于服务器正在接受 Web 请求,因此您确实应该检查 HTTP 标头以确定是否有客户端接受 GZIP 编码,而不是每次都猜测和 gzip 压缩。
如果 PHP 客户端可以执行 gzip,它将设置标头,然后您的代码将做出相应反应并执行正确的操作。当为您的代码提供了解客户端功能的工具时,假设或猜测是一个糟糕的选择。
我最近发布了一篇文章,展示了如何在 C# 中压缩/解压缩。我将它用于几乎相同的场景。我想将日志文件从客户端传输到服务器,它们通常非常大。然而,就我而言,我的 Web 服务在 .NET 中运行,因此我可以使用解压缩方法。但看起来 PHP 确实支持一种名为 gzdecode 的方法,该方法可以工作。
我能够在 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'));