首页 > 编程语言 >php&.net对称压缩解压缩探讨

php&.net对称压缩解压缩探讨

时间:2023-01-05 17:39:35浏览次数:40  
标签:str 解压缩 Length ms new net php buf byte


C#客户端访问PHP SOAP WebService,当传输大量文本数据时,可以通过压缩减少网络传输。

C#在System.IO.Compression命名空间下提供了两个类GZipStream 类和DeflateStream类来进行数据的压缩和解压缩。经本人实验,在C#下使用GZipStream压缩的字符串在PHP下使用gzuncompress函数无法解压缩,有人说可以使用gzdecode解开,但本人的PHP不支持gzdecode函数,但有gzencode函数(why?原因未明,据说是PHP的BUG,可能到PHP6才提供此函数)。

C#下使用DeflateStream类压缩文本后,可以在PHP下用gzinflate解压缩。示例代码如下:

客户端C#(在头4个字节增加了原文本的长度,方便在C#中解压缩,对于在PHP端解压缩这个没有用处):


public static string Compress(string text)
{
byte[] buffer = Encoding.UTF8.GetBytes(text);
MemoryStream ms = new MemoryStream();
using (DeflateStream zip = new DeflateStream(ms, CompressionMode.Compress, true))
{
zip.Write(buffer, 0, buffer.Length);
}
ms.Position = 0;
MemoryStream outStream = new MemoryStream();
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);
byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);
}


 服务端PHP:

 

function Decompress($strSource)
{
$strTemp = base64_decode($strSource);
$strTemp = substr($strTemp, 4);
return gzinflate($strTemp);
}

 支持中文,编码为UTF8.

 

/// <summary>
/// 简单的压缩
/// </summary>
public static class CompressHelper
{
/// <summary>
/// 压缩字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] CompressString(string str)
{
return CompressBytes(Encoding.UTF8.GetBytes(str));
}

/// <summary>
/// 压缩二进制
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] CompressBytes(byte[] str)
{
var ms = new MemoryStream(str) {Position = 0};
var outms = new MemoryStream();
using (var deflateStream = new DeflateStream(outms, CompressionMode.Compress, true))
{
var buf = new byte[1024];
int len;
while ((len = ms.Read(buf, 0, buf.Length)) > 0)
deflateStream.Write(buf, 0, len);
}
return outms.ToArray();
}
/// <summary>
/// 解压字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string DecompressString(byte[] str)
{
return Encoding.UTF8.GetString(DecompressBytes(str));
}
/// <summary>
/// 解压二进制
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] DecompressBytes(byte[] str)
{
var ms = new MemoryStream(str) {Position = 0};
var outms = new MemoryStream();
using (var deflateStream = new DeflateStream(ms, CompressionMode.Decompress, true))
{
var buf = new byte[1024];
int len;
while ((len = deflateStream.Read(buf, 0, buf.Length)) > 0)
outms.Write(buf, 0, len);
}
return outms.ToArray();
}
}


 

 

标签:str,解压缩,Length,ms,new,net,php,buf,byte
From: https://blog.51cto.com/kenkao/5991598

相关文章

  • VB.NET写DXF组码注意事项
    使用VB.NET写DXF组码的时候,需要注意gpcode需要定义为Int16,而不是Integer,应为VB.NET与VB的Integer默认长度是不一样的。另外块参照的组码是INSERT。示例:Dimdatav......
  • 简单的C#&PHP对称加解密
    byte[]ctxbytes=System.Text.Encoding.UTF8.GetBytes(ctx);byte[]keybytes=System.Text.Encoding.UTF8.GetBytes(key);intctxLen=ctxbytes.Length......
  • as3与php交互实现总结
     目前flash在各方个面的应用越来越广,而flash也不单只是注重自身绚丽的效果,也需要和外界程序交换数据,以实现更强大的功能,随着as3的到来,flash和外部交互的方式也越来越简便......
  • PHP异步调用实现方式
    PHP异步调用实现方式浏览器和服务器之间只一种面向无连接的HTTP协议进行通讯的,面向无连接的程序的特点是客户端请求服务端,服务端根据请求输出相应的程序,不能保持持久连接。......
  • netcore 使用apollo
    一、创建配置应用    ①、创建应用     ②、填写应用信息     ③、删除默认命名空间     ④、新增命名空间      ......
  • 云原生安全系列 4:6个 Kubernetes 安全最佳实践
    引言:Kubernetes为我们提供了一套很好的核心软件安全原则,但我们仍然需要理解并实施它们。对于Kubernetes集群分布式部署,攻击向量的数量也会增加,了解并尽可能限制这些攻击面......
  • C# Windows 窗体的.Net 框架绘图技术
     当编写一个典型的Windows窗体​​程序​​时,窗体和控件的绘制、效果等操作是不需要特别加以考虑的。这是为什么呢?因为通过使用​​.Net​​本文针对那些Windows窗......
  • 重磅直播|PatchmatchNet:一种高效的Multi-view Stereo框架(CVPR2021)
    本期由苏黎世联邦理工学院ComputerVisionandGeometryGroup王方锦华博士分享,分享的主题为《PatchmatchNet:基于传统PatchMatch算法的高效Multi-viewStereo框架》,主讲人会......
  • C# WPF中使用SqLite-net数据库
    在研究安卓手机与pc电脑使用数据线进行数据传输的过程中(为啥这么二,因为甲方人员不允许使用互联网,就算是内部的局域网wifi都不可以),涉及到了WPF操作安卓常用数据库SqlLite的......
  • 一款.NET下的性能超高的SQLite操作库
    SQLite 已经成为小型数据库的王者,成为构建桌面程序、小型 Web 应用等必不可少的工具。给广大 .NETer 推荐一款.NET下的 SQLite 包装库 SQLite-net,非常好用,性能也......