/// <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); }
/// <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); } } }
/// <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); }