天天看點

備忘: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();
        }      

繼續閱讀