public AmpMessage Decode(IBufferReader reader) { if (reader.ReadableBytes == 0) { return(null); } AmpMessage msg = new AmpMessage(); if (reader.ReadableBytes < 10) { throw new Rpc.Exceptions.RpcCodecException("消息不正确,小于头长度"); } msg.Version = reader.ReadByte(); int length = reader.ReadInt(); msg.Sequence = reader.ReadInt(); byte type = reader.ReadByte(); msg.InvokeMessageType = InvokeMessageTypeParser.Parse(type); msg.ServiceId = reader.ReadUShort(); msg.MessageId = reader.ReadUShort(); int left = length - 14; if (left > 0) { if (left > reader.ReadableBytes) { throw new Rpc.Exceptions.RpcCodecException("消息长度不正确"); } msg.Data = new byte[left]; reader.ReadBytes(msg.Data); } return(msg); }
public AmpMessage Decode(IBufferReader reader) { if (reader.ReadableBytes == 0) { return(null); } AmpMessage msg = new AmpMessage(); if (reader.ReadableBytes < AmpMessage.HEAD_LENGTH) { throw new Rpc.Exceptions.RpcCodecException($"decode error ,ReadableBytes={reader.ReadableBytes},HEAD_LENGTH={AmpMessage.HEAD_LENGTH}"); } msg.Version = reader.ReadByte(); int length = reader.ReadInt(); msg.Sequence = reader.ReadInt(); byte type = reader.ReadByte(); msg.InvokeMessageType = Rpc.Utils.ParseUtils.ParseMessageType(type); msg.ServiceId = reader.ReadUShort(); msg.MessageId = reader.ReadUShort(); msg.Code = reader.ReadInt(); int left = length - AmpMessage.HEAD_LENGTH; if (left > 0) { if (left > reader.ReadableBytes) { throw new Rpc.Exceptions.RpcCodecException("消息长度不正确"); } msg.Data = new byte[left]; reader.ReadBytes(msg.Data); } return(msg); }
public AmpMessage Parse(IBufferReader reader) { if (reader.ReadableBytes == 0) { return(null); } var msg = new AmpMessage { Version = reader.ReadByte() }; int headLength; if (msg.Version == 0) { headLength = AmpMessage.VERSION_0_HEAD_LENGTH; if (reader.ReadableBytes < AmpMessage.VERSION_0_HEAD_LENGTH - 1) { throw new RpcCodecException($"decode error ,ReadableBytes={reader.ReadableBytes+1},HEAD_LENGTH={AmpMessage.VERSION_0_HEAD_LENGTH}"); } } else if (msg.Version == 1) { headLength = AmpMessage.VERSION_1_HEAD_LENGTH; if (reader.ReadableBytes < AmpMessage.VERSION_1_HEAD_LENGTH - 1) { throw new RpcCodecException($"decode error ,ReadableBytes={reader.ReadableBytes+1},HEAD_LENGTH={AmpMessage.VERSION_1_HEAD_LENGTH}"); } } else { throw new RpcCodecException($"decode error ,{msg.Version} is not support"); } var length = reader.ReadInt(); msg.Sequence = reader.ReadInt(); var type = reader.ReadByte(); msg.InvokeMessageType = (InvokeMessageType)Enum.ToObject(typeof(InvokeMessageType), type); msg.ServiceId = msg.Version == 0 ? reader.ReadUShort() : reader.ReadInt(); msg.MessageId = reader.ReadUShort(); msg.Code = reader.ReadInt(); if (msg.Version == 1) { byte codeType = reader.ReadByte(); if (codeType != this._serializer.CodecType) { throw new RpcCodecException($"CodecType:{codeType} is not Match {this._serializer.CodecType}"); } msg.CodecType = (CodecType)Enum.ToObject(typeof(CodecType), codeType); } else { msg.CodecType = CodecType.Protobuf; } int left = length - headLength; if (left > 0) { if (left > reader.ReadableBytes) { throw new RpcCodecException("message not long enough!"); } msg.Data = new byte[left]; reader.ReadBytes(msg.Data); } return(msg); }