public static byte[] CreateData(IPacket packet) { if (packet == null) throw new ArgumentNullException("packet"); var content = packet.GetContent(); var idLengthContent = new byte[content.Length + PacketIdFieldWidth + ContentLengthFieldWidth]; idLengthContent[0] = (byte)packet.Id; var contentLength = BitConverter.GetBytes(content.Length); idLengthContent[1] = contentLength[0]; // Not in the mood for a for loop idLengthContent[2] = contentLength[1]; idLengthContent[3] = contentLength[2]; idLengthContent[4] = contentLength[3]; for (int i = (PacketIdFieldWidth + ContentLengthFieldWidth); i < idLengthContent.Length; ++i) idLengthContent[i] = content[i - (PacketIdFieldWidth + ContentLengthFieldWidth)]; byte[] checksum; using (var provider = new Crc32()) checksum = provider.ComputeHash(idLengthContent, 0, idLengthContent.Length); using (var ms = new MemoryStream()) { ms.Write(checksum, 0, ChecksumWidth); ms.Write(idLengthContent, 0, idLengthContent.Length); return ms.ToArray(); } }