项目结构为c#服务器,客户端为qt,通信数据使用zlib压缩,因为qt的qCompress使用的就是zlib压缩,c#服务端使用的是zlib.net,虽然都是一种压缩算法,不过格式上还是有点区别,qt压缩得到的字节数组前四位保存有压缩前字节数组的长度信息,因此在c#端就要做下处理,或者在qt端做下处理再传送,这里选择的是在c#端处理,刚接触qt,还不熟。
qt 直接压缩或解压
c#端的代码如下:
解压:
public static byte[] UnCompress(byte[] bin)
{
//先去除字节数组的前四位再解压,这是为了配合Qt的压缩
List<byte> bt = new List<byte>();
bt.AddRange(bin);
bt.RemoveRange(0, 4);
MemoryStream msout = new MemoryStream();
MemoryStream mstem = new MemoryStream(bt.ToArray());
zlib.ZOutputStream outstream = new zlib.ZOutputStream(msout);
try
{
CopyStream(mstem, outstream);
}
finally
{
outstream.Close();
mstem.Close();
msout.Close();
}
byte[] bout = msout.ToArray();
return bout;
}
public static byte[] Compress(byte[] bin)
{
//得到压缩结果后,在字节数组的最前四个字节加上原字节数组的尺寸信息,一个取整一个取余,这是为了配合Qt的解压
int f1 = bin.Length / 256;
int f2 = bin.Length % 256;
MemoryStream msout = new MemoryStream();
MemoryStream mstem = new MemoryStream(bin);
zlib.ZOutputStream outstream = new zlib.ZOutputStream(msout, zlib.zlibConst.Z_DEFAULT_COMPRESSION);
try
{
CopyStream(mstem, outstream);
}
finally
{
outstream.Close();
mstem.Close();
msout.Close();
}
byte[] bout = msout.ToArray();
List<byte> bt = new List<byte>();
bt.AddRange(bout);
bt.Insert(0, 0);
bt.Insert(1, 0);
bt.Insert(2, (byte)f1);
bt.Insert(3, (byte)f2);
return bt.ToArray();
}