public void PackData(byte[] data, int datalength, byte[] outdata, out int outlength)
        {
            var comdata = FileManager.DeflateCompress(data, 0, datalength, out var outlen);

            outlength  = outlen + 2 + 4;
            outdata[0] = (byte)(outlength >> 8);
            outdata[1] = (byte)outlength;
            Array.Copy(comdata, 0, outdata, 2, outlen);
            var adler = Adler32.CalcAdler32(data, datalength);

            outdata[outlength - 4] = (byte)(adler >> 24);
            outdata[outlength - 3] = (byte)(adler >> 16);
            outdata[outlength - 2] = (byte)(adler >> 8);
            outdata[outlength - 1] = (byte)adler;
        }
        public override byte[] ClientPostDecrypt(byte[] plaindata, int datalength, out int outlength)
        {
            byte[] outdata = new byte[recv_buf_len + datalength * 2 + 16];
            Array.Copy(plaindata, 0, recv_buf, recv_buf_len, datalength);
            recv_buf_len += datalength;
            outlength     = 0;
            while (recv_buf_len > 2)
            {
                int len = (recv_buf[0] << 8) + recv_buf[1];
                if (len >= 32768 || len < 6)
                {
                    throw new ObfsException("ClientPostDecrypt data error");
                }
                if (len > recv_buf_len)
                {
                    break;
                }

                int    outlen;
                byte[] buf = FileManager.DeflateDecompress(recv_buf, 2, len - 6, out outlen);
                if (buf != null)
                {
                    ulong alder = Adler32.CalcAdler32(buf, outlen);
                    if (recv_buf[len - 4] == (byte)(alder >> 24) &&
                        recv_buf[len - 3] == (byte)(alder >> 16) &&
                        recv_buf[len - 2] == (byte)(alder >> 8) &&
                        recv_buf[len - 1] == (byte)(alder))
                    {
                        //pass
                    }
                    else
                    {
                        throw new ObfsException("ClientPostDecrypt data decompress ERROR");
                    }
                    Utils.SetArrayMinSize2(ref outdata, outlength + outlen);
                    Array.Copy(buf, 0, outdata, outlength, outlen);
                    outlength    += outlen;
                    recv_buf_len -= len;
                    Array.Copy(recv_buf, len, recv_buf, 0, recv_buf_len);
                    len = (recv_buf[0] << 8) + recv_buf[1];
                }
                else
                {
                    throw new ObfsException("ClientPostDecrypt data decompress ERROR");
                }
            }
            return(outdata);
        }