备忘:c# 和Qt 交换压缩数据

项目结构为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();
        }


CopyStream方法是借用zlib.net附带的示例代码。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值