Example #1
0
        /// <summary>
        /// 全新的decode,将去头去尾的bytes放进来decode即可
        /// </summary>
        /// <param name="full_byte">去头去尾后的整个报文</param>
        /// <param name="info_base">返回值</param>
        /// <param name="file_fragment">若为文件类型报文,将携带文件片段信息</param>
        /// <returns></returns>
        public bool decodemes(byte[] full_byte, out SKMsgInfoBase info_base, out byte[] file_fragment)
        {
            file_fragment = null;
            info_base     = null;
            bool ret = false;

            try
            {
                int    json_len    = BitConverter.ToInt32(full_byte, 0) - 12;
                int    another_len = BitConverter.ToInt32(full_byte, 4);
                byte[] json_bytes  = new byte[json_len];
                Array.Copy(full_byte, 8, json_bytes, 0, json_len);
                JObject json_object = JObject.Parse(Encoding.UTF8.GetString(json_bytes));
                int     id          = (int)json_object["id"];
                string  type_s      = (string)json_object["type"];
                string  time_s      = (string)json_object["time"];
                string  md5         = (string)json_object["md5"];
                string  stu_num     = (string)json_object["stu_num"];
                md5 = md5.ToLower();
                SKMsgInfoBase.mestype type = get_type(type_s);
                switch (type)
                {
                case SKMsgInfoBase.mestype.EXIT:
                case SKMsgInfoBase.mestype.RESPONSE:
                case SKMsgInfoBase.mestype.FRIEND_INVITE:
                {
                    info_base           = new SKMsgInfoBase();
                    info_base.stu_num   = stu_num;
                    info_base.id        = id;
                    info_base.type      = type;
                    info_base.verified  = true;
                    info_base.timestamp = DateTime.ParseExact(time_s, "yyyy.MM.dd HH:mm:ss", null);
                    break;
                }

                case SKMsgInfoBase.mestype.FILE:
                {
                    info_base         = new SKMsgInfoFile();
                    info_base.stu_num = stu_num;
                    SKMsgInfoFile info_file = (SKMsgInfoFile)info_base;
                    info_file.id            = id;
                    info_file.type          = type;
                    info_file.verified      = true;
                    info_file.timestamp     = DateTime.ParseExact(time_s, "yyyy.MM.dd HH:mm:ss", null);
                    info_file.max_fragment  = (int)json_object["data"]["max_fragment"];
                    info_file.this_fragment = (int)json_object["data"]["this_fragment"];
                    if (another_len != 0)
                    {
                        file_fragment = new byte[another_len];
                        Array.Copy(full_byte, 8 + json_len, file_fragment, 0, another_len);
                    }
                    break;
                }

                case SKMsgInfoBase.mestype.FILE_INVITE:
                {
                    info_base         = new SKMsgInfoFileInvite();
                    info_base.stu_num = stu_num;
                    SKMsgInfoFileInvite info_file_invite = (SKMsgInfoFileInvite)info_base;
                    info_file_invite.id        = id;
                    info_file_invite.type      = type;
                    info_file_invite.verified  = true;
                    info_file_invite.timestamp = DateTime.ParseExact(time_s, "yyyy.MM.dd HH:mm:ss", null);
                    info_file_invite.size      = (int)json_object["data"]["size"];
                    info_file_invite.file_name = (string)json_object["data"]["file_name"];
                    break;
                }

                case SKMsgInfoBase.mestype.GROUP_TEXT:
                {
                    info_base         = new SKMsgInfoGroupText();
                    info_base.stu_num = stu_num;
                    SKMsgInfoGroupText info_group_text = (SKMsgInfoGroupText)info_base;
                    info_group_text.id        = id;
                    info_group_text.type      = type;
                    info_group_text.verified  = true;
                    info_group_text.timestamp = DateTime.ParseExact(time_s, "yyyy.MM.dd HH:mm:ss", null);
                    int list_len = (int)json_object["data"]["list_len"];
                    info_group_text.text_pack.name = (string)json_object["data"]["name"];
                    info_group_text.text_pack.text = (string)json_object["data"]["text"];
                    for (int i = 0; i < list_len; i++)
                    {
                        info_group_text.stu_num_list.Add((string)json_object["data"]["stu_num_list"][i]);
                    }
                    break;
                }

                case SKMsgInfoBase.mestype.TEXT:
                {
                    info_base         = new SKMsgInfoText();
                    info_base.stu_num = stu_num;
                    SKMsgInfoText info_text = (SKMsgInfoText)info_base;
                    info_text.id             = id;
                    info_text.type           = type;
                    info_text.verified       = true;
                    info_text.timestamp      = DateTime.ParseExact(time_s, "yyyy.MM.dd HH:mm:ss", null);
                    info_text.text_pack.name = (string)json_object["data"]["name"];
                    info_text.text_pack.text = (string)json_object["data"]["text"];
                    break;
                }

                case SKMsgInfoBase.mestype.SYNC:
                {
                    info_base           = new SKMsgInfoSync();
                    info_base.stu_num   = stu_num;
                    info_base.id        = id;
                    info_base.type      = type;
                    info_base.verified  = true;
                    info_base.timestamp = DateTime.ParseExact(time_s, "yyyy.MM.dd HH:mm:ss", null);
                    SKMsgInfoSync info_sync = (SKMsgInfoSync)info_base;
                    info_sync.comment    = (string)json_object["data"]["comment"];
                    info_sync.name       = (string)json_object["data"]["name"];
                    info_sync.head_60_60 = from_base64((string)json_object["data"]["head"]);
                    break;
                }

                default:
                {
                    ret = false;
                    break;
                }
                }
                ret = true;
            }
            catch (Exception)
            {
                ret = false;
            }
            return(ret);
        }
Example #2
0
        /// <summary>
        /// 全新的encode,将SKMsgInfoBase放进来即可
        /// </summary>
        /// <param name="info_base">要发送的消息</param>
        /// <param name="jsonb">返回的字节数组</param>
        /// <param name="file_fragment">可选,文件片段</param>
        /// <returns></returns>
        public bool encodemes(SKMsgInfoBase info_base, out byte[] jsonb, byte[] file_fragment = null)
        {
            int len1 = 0;

            jsonb = null;
            bool ret = false;

            try
            {
                string  s = string.Empty;
                JObject j = new JObject();
                s += "{";
                s += "\"else\":{},";
                s += "\"id\":" + info_base.id.ToString() + ",";
                s += "\"time\":\"" + info_base.timestamp.ToString("yyyy.MM.dd HH:mm:ss") + "\",";
                s += "\"stu_num\":\"" + info_base.stu_num + "\",";
                switch (info_base.type)
                {
                case SKMsgInfoBase.mestype.EXIT:
                {
                    s += "\"type\":\"exit\",";
                    s += "\"data\":{},";
                    List <byte[]> con_byte = new List <byte[]>();
                    con_byte.Add(BitConverter.GetBytes(info_base.id));
                    con_byte.Add(Encoding.UTF8.GetBytes("exit"));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_base.timestamp.ToString("yyyy.MM.dd HH:mm:ss")));
                    s  += "\"md5\":\"" + getmd5(byte_connect(con_byte)) + "\"";
                    s  += "}";
                    ret = true;
                    break;
                }

                case SKMsgInfoBase.mestype.FILE:
                {
                    SKMsgInfoFile info_file = (SKMsgInfoFile)info_base;
                    s  += "\"type\":\"file\",";
                    s  += "\"data\":{";
                    s  += "\"max_fragment\":" + info_file.max_fragment.ToString() + ",";
                    s  += "\"this_fragment\":" + info_file.this_fragment.ToString();
                    s  += "},";
                    s  += "\"md5\":\"" + getmd5(file_fragment) + "\"";
                    s  += "}";
                    ret = true;
                    break;
                }

                case SKMsgInfoBase.mestype.FILE_INVITE:
                {
                    SKMsgInfoFileInvite info_file_invite = (SKMsgInfoFileInvite)info_base;
                    s += "\"type\":\"file_invite\",";
                    s += "\"data\":{";
                    s += "\"size\":" + info_file_invite.size.ToString() + ",";
                    s += "\"file_name\":\"" + info_file_invite.file_name.ToString() + "\"";
                    s += "},";
                    List <byte[]> con_byte = new List <byte[]>();
                    con_byte.Add(BitConverter.GetBytes(info_base.id));
                    con_byte.Add(Encoding.UTF8.GetBytes("file_invite"));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_base.timestamp.ToString("yyyy.MM.dd HH:mm:ss")));
                    s  += "\"md5\":\"" + getmd5(byte_connect(con_byte)) + "\"";
                    s  += "}";
                    ret = true;
                    break;
                }

                case SKMsgInfoBase.mestype.GROUP_TEXT:
                {
                    SKMsgInfoGroupText info_group_text = (SKMsgInfoGroupText)info_base;
                    s += "\"type\":\"group_text\",";
                    s += "\"data\":{";
                    s += "\"name\":\"" + add_special_char(info_group_text.text_pack.name) + "\",";
                    s += "\"text\":\"" + add_special_char(info_group_text.text_pack.text) + "\",";
                    s += "\"list_len\":" + info_group_text.stu_num_list.Count.ToString() + ",";
                    s += "\"stu_num_list\":[";
                    for (int i = 0; i < info_group_text.stu_num_list.Count - 1; i++)
                    {
                        s += "\"" + info_group_text.stu_num_list[i] + "\",";
                    }
                    s += "\"" + info_group_text.stu_num_list[info_group_text.stu_num_list.Count - 1] + "\"";
                    s += "]";
                    s += "},";
                    List <byte[]> con_byte = new List <byte[]>();
                    con_byte.Add(BitConverter.GetBytes(info_group_text.id));
                    con_byte.Add(Encoding.UTF8.GetBytes("text"));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_group_text.timestamp.ToString("yyyy.MM.dd HH:mm:ss")));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_group_text.text_pack.name));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_group_text.text_pack.text));
                    s  += "\"md5\":\"" + getmd5(byte_connect(con_byte)) + "\"";
                    s  += "}";
                    ret = true;
                    break;
                }

                case SKMsgInfoBase.mestype.RESPONSE:
                {
                    s += "\"type\":\"response\",";
                    s += "\"data\":{},";
                    List <byte[]> con_byte = new List <byte[]>();
                    con_byte.Add(BitConverter.GetBytes(info_base.id));
                    con_byte.Add(Encoding.UTF8.GetBytes("response"));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_base.timestamp.ToString("yyyy.MM.dd HH:mm:ss")));
                    s  += "\"md5\":\"" + getmd5(byte_connect(con_byte)) + "\"";
                    s  += "}";
                    ret = true;
                    break;
                }

                case SKMsgInfoBase.mestype.FRIEND_INVITE:
                {
                    s += "\"type\":\"friend_invite\",";
                    s += "\"data\":{},";
                    List <byte[]> con_byte = new List <byte[]>();
                    con_byte.Add(BitConverter.GetBytes(info_base.id));
                    con_byte.Add(Encoding.UTF8.GetBytes("friend_invite"));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_base.timestamp.ToString("yyyy.MM.dd HH:mm:ss")));
                    s  += "\"md5\":\"" + getmd5(byte_connect(con_byte)) + "\"";
                    s  += "}";
                    ret = true;
                    break;
                }

                case SKMsgInfoBase.mestype.TEXT:
                {
                    SKMsgInfoText info_text = (SKMsgInfoText)info_base;
                    s += "\"type\":\"text\",";
                    s += "\"data\":{";
                    s += "\"name\":\"" + add_special_char(info_text.text_pack.name) + "\",";
                    s += "\"text\":\"" + add_special_char(info_text.text_pack.text) + "\"";
                    s += "},";
                    List <byte[]> con_byte = new List <byte[]>();
                    con_byte.Add(BitConverter.GetBytes(info_text.id));
                    con_byte.Add(Encoding.UTF8.GetBytes("text"));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_text.timestamp.ToString("yyyy.MM.dd HH:mm:ss")));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_text.text_pack.name));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_text.text_pack.text));
                    s  += "\"md5\":\"" + getmd5(byte_connect(con_byte)) + "\"";
                    s  += "}";
                    ret = true;
                    break;
                }

                case SKMsgInfoBase.mestype.SYNC:
                {
                    SKMsgInfoSync info_sync = (SKMsgInfoSync)info_base;
                    s += "\"type\":\"sync\",";
                    s += "\"data\":{";
                    s += "\"name\":\"" + info_sync.name + "\",";
                    s += "\"comment\":\"" + info_sync.comment + "\",";
                    s += "\"head\":\"" + to_base64(info_sync.head_60_60) + "\"";
                    s += "},";
                    List <byte[]> con_byte = new List <byte[]>();
                    con_byte.Add(BitConverter.GetBytes(info_base.id));
                    con_byte.Add(Encoding.UTF8.GetBytes("sync"));
                    con_byte.Add(Encoding.UTF8.GetBytes(info_base.timestamp.ToString("yyyy.MM.dd HH:mm:ss")));
                    s  += "\"md5\":\"" + getmd5(byte_connect(con_byte)) + "\"";
                    s  += "}";
                    ret = true;
                    break;
                }

                default:
                {
                    ret   = false;
                    jsonb = null;
                    break;
                }
                }
                if (ret)
                {
                    List <byte[]> final      = new List <byte[]>();
                    byte[]        first_part = Encoding.UTF8.GetBytes(s);
                    len1 = first_part.Length + 12;
                    if (info_base.type == SKMsgInfoBase.mestype.FILE)
                    {
                        byte[] len1b = BitConverter.GetBytes(len1);
                        byte[] len2b = BitConverter.GetBytes(file_fragment.Length);
                        final.Add(len1b);
                        final.Add(len2b);
                        final.Add(first_part);
                        final.Add(file_fragment);
                        jsonb = byte_connect(final);
                    }
                    else
                    {
                        byte[] len1b = BitConverter.GetBytes(len1);
                        byte[] len2b = BitConverter.GetBytes(0);
                        final.Add(len1b);
                        final.Add(len2b);
                        final.Add(first_part);
                        jsonb = byte_connect(final);
                    }
                }
            }
            catch (Exception)
            {
                ret = false;
            }
            return(ret);
        }