zlib是提供数据压缩用的函式库 ,本文简单介绍zlib.net解压数组碰到的痛点
简单粗暴直接上代码
public static byte[] Compress(byte[] bytes)
{
return bytes;
if (bytes.Length < 2)
{
return bytes;
}
using (var ms = new System.IO.MemoryStream())
{
using (ZOutputStream outZStream = new ZOutputStream(ms, zlibConst.Z_BEST_COMPRESSION))
{
outZStream.Write(bytes, 0, bytes.Length);
outZStream.Flush();
}
return ms.ToArray();
}
}
public static byte[] Uncompress(byte[] bytes)
{
//小于2个字节肯定是非压缩的
if (bytes.Length < 2)
{
return bytes;
}
//判断是否是压缩数据,是才执行解开压缩操作
if (0x78 != bytes[0])
{
return bytes;
}
//注意这里,这是遇到的小坑
if (0x9C != bytes[1] && 0xDA != bytes[1])
{
return bytes;
}
using (var ms = new MemoryStream())
{
using (ZOutputStream outZStream = new ZOutputStream(ms))
{
outZStream.Write(bytes, 0, bytes.Length);
outZStream.Flush();
}
return ms.ToArray();
}
}
遇到的小坑
精髓就在下面的代码块中,对0x78这块由于之前有印象,所以直接加上了,但解压的时候还有时候报错,因为zlib自动生成的头部有2个字节的含义
//判断是否是压缩数据,是才执行解开压缩操作
if (0x78 != bytes[0])
{
return bytes;
}
//注意这里,这是遇到的小坑
if (0x9C != bytes[1] && 0xDA != bytes[1])
{
return bytes;
}
头部两个字节,定义压缩类型
|--------- |----------|
|CMF |LEVEL |
CMF: OX78 即首字节byte[0],表示压缩格式为ZIP
LEVEL: 0xDA 即首字节byte[1],表示压缩的等级
对应压缩时所选的等级zlibConst.Z_BEST_COMPRESSION
解压出错的两种情况,第一次是由于没有加入bytes[1]限制,导致有些压缩部分解压出错
修复后又出现是因为 byte[1] 判断的等级和压缩时所选择的等级不一致导致的