public PacketResult Process(byte[] payload, Blowfish blowfish) { if (payload.Length < Header.Length) { return(PacketResult.Malformed); } PacketHeader = payload.Copy(0, Header.Length).UnMarshal <Header>(); // missing data, need to wait for remaining data and combine if (PacketHeader.Size > payload.Length) { return(PacketResult.Fragmented); } if (PacketHeader.SubPackets == 0) { return(PacketResult.Malformed); } var payloadData = new byte[PacketHeader.Size - Header.Length]; Buffer.BlockCopy(payload, Header.Length, payloadData, 0, payloadData.Length); if (PacketHeader.Compressed == 1) { if (!ZlibProvider.Deflate(payloadData, out payloadData)) { return(PacketResult.Malformed); } } using (var stream = new MemoryStream(payloadData)) { using (var reader = new BinaryReader(stream)) { for (uint i = 0u; i < PacketHeader.SubPackets; i++) { SubPacket subPacket; PacketResult result = SubPacket.Process(reader, blowfish, out subPacket); if (result != PacketResult.Ok) { return(result); } SubPackets.Add(subPacket); } } } return(PacketResult.Ok); }