一、本文分享一个压缩字节数组数据的类库
在编写网络通信程序中,客户端和服务端之间需要通信,通信的格式通常是字节数组,也就是byte[]。
发送的函数通常是
byte[] data=new byte[100];
socket.send(data);
考虑到网络带宽,如果可以尽可能得减少发送的字节数量,网络程序将更健壮,占用内存更低,反正可能更好。
二、System.IO.Compression
System.IO.Compression命名空间包含以下类来对文件和流进行压缩或解压缩。 还可以使用这些类型来读取和修改压缩文件的内容:
(1)ZipFile
(2)ZipArchive
(3)ZipArchiveEntry
(4)DeflateStream
(5)GZipStream
来源于:https://learn.microsoft.com/zh-cn/dotnet/standard/io/how-to-compress-and-extract-files
三、压缩字节数组数据
public static byte[] Compress(byte[] data, int offset, int lenght)
{
byte[] buffer = null;
try
{
MemoryStream ms = new MemoryStream();
GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true);
zip.Write(data, offset, lenght);
zip.Close();
buffer = new byte[ms.Length];
ms.Position = 0;
ms.Read(buffer, 0, buffer.Length);
ms.Close();
}
catch { }
return buffer;
}
四、解压缩字节数组
于文末下载源码。
五、测试
string str = "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
Console.WriteLine("原文:" + str);
byte[] buffer = Encoding.Default.GetBytes(str);
Console.WriteLine("原字节长度:"+buffer.Length);
byte[] b = GZipHelper.Compress(buffer);
Console.WriteLine("压缩后字节长度:" + b.Length);
Console.WriteLine("减少:" + (buffer.Length-b.Length));
byte[] c = GZipHelper.Decompress(b);
Console.WriteLine("解压缩后字节长度:" + c.Length);
Console.WriteLine("原文:" + Encoding.Default.GetString(buffer));
测试时写的原文内容是103个相同的字符“1”,在压缩率会相当高,若改成没有规律的字符串,压缩率会低很多。
我已将代码上传,下载码是:C0314C805D
下载码是啥?如何下载=》点击查看