public static RedisMessage FromBytes(IMessageEncryptor encryptor, byte[] data, TraceSource trace) { using (var stream = new MemoryStream(data)) { var message = new RedisMessage(); // read message id from memory stream until SPACE character var messageIdBuilder = new StringBuilder(20); do { // it is safe to read digits as bytes because they encoded by single byte in UTF-8 int charCode = stream.ReadByte(); if (charCode == -1) { trace.TraceVerbose("Received Message could not be parsed."); throw new EndOfStreamException(Resources.Error_EndOfStreamRedis); } char c = (char)charCode; if (c == ' ') { message.Id = ulong.Parse(messageIdBuilder.ToString(), CultureInfo.InvariantCulture); messageIdBuilder = null; } else { messageIdBuilder.Append(c); } }while (messageIdBuilder != null); var encryptedBinaryReader = new BinaryReader(stream); var encryptedData = encryptedBinaryReader.ReadBytes((int)(stream.Length - stream.Position)); var decryptedData = encryptor.Decrypt(encryptedData); using (var dataStream = new MemoryStream(decryptedData)) using (var decryptedReader = new BinaryReader(dataStream)) { int count = decryptedReader.ReadInt32(); byte[] buffer = decryptedReader.ReadBytes(count); message.ScaleoutMessage = ScaleoutMessage.FromBytes(buffer); } return(message); } }