Exemplo n.º 1
0
        /// <summary>
        /// 解码protobuf消息
        /// </summary>
        /// <param name="data">字节数据</param>
        /// <param name="t_query">消息(id->type)查询函数</param>
        /// <param name="msg">返回的消息object</param>
        /// <param name="id">返回的消息id</param>
        /// <returns></returns>
        public static bool Decode(
            byte[] data, PBChannel.MsgTypeQuery t_query,
            out IMessage msg, out uint id)
        {
            using (MemoryStream ms = new MemoryStream(data))
            {
                byte[] id_bytes = new byte[4];
                ms.Read(id_bytes, 0, 4);

                id = BitConverter.ToUInt32(id_bytes, 0);
                id = (uint)IPAddress.NetworkToHostOrder((int)id);

                Type t = t_query(id);
                msg = null;
                if (null != t)
                {
                    msg = t.InvokeMember(
                        "ParseFrom",
                        BindingFlags.Public |
                        BindingFlags.Static |
                        BindingFlags.InvokeMethod,
                        null,
                        null,
                        new object[] { ms }) as IMessage;
                    return(null != msg);
                }
            }
            return(false);
        }
Exemplo n.º 2
0
 /// <summary>
 /// 初始化一个channel
 /// </summary>
 /// <param name="channel">CoreMessageExtendType的枚举值</param>
 /// <param name="msgid_query">id->type的查询函数</param>
 /// <param name="msgtype_query">type->id的查询函数</param>
 public void AddChannel(byte channel,
                        PBChannel.MsgIdQuery msgid_query,
                        PBChannel.MsgTypeQuery msgtype_query)
 {
     if (channel < channels_.Length)
     {
         if (null == channels_[channel])
         {
             channels_[channel] = new PBChannel(channel, svr_api_, msgid_query, msgtype_query);
         }
     }
 }
Exemplo n.º 3
0
        /// <summary>
        /// 解码protobuf消息
        /// </summary>
        /// <param name="data">字节数据</param>
        /// <param name="t_query">消息(id->type)查询函数</param>
        /// <param name="msg">返回的消息object</param>
        /// <param name="id">返回的消息id</param>
        /// <returns></returns>
        public static bool Decode(
            byte[] data, PBChannel.MsgTypeQuery t_query,
            out object msg, out int id)
        {
            bool ret = false;

            id = BitConverter.ToInt32(data, 0);
            id = IPAddress.NetworkToHostOrder(id);
            Type t = t_query(id);

            if (null != t)
            {
                DataStream.SetLength(0);
                DataStream.Write(data, 4, data.Length - 4);
                DataStream.Position = 0;
                try {
                    msg = Serializer.Deserialize(DataStream, null, t);
                    if (msg == null)
                    {
                        ret = false;
                    }
                    else
                    {
                        ret = true;
                    }
                } catch {
                    msg = null;
                    ret = false;
                }
            }
            else
            {
                msg = null;
            }
            return(ret);
        }