public ArraySegment <byte> Serialize(MqttBasePacket packet) { if (packet == null) { throw new ArgumentNullException(nameof(packet)); } // Leave enough head space for max header size (fixed + 4 variable remaining length = 5 bytes) _packetWriter.Reset(); _packetWriter.Seek(5); var fixedHeader = SerializePacket(packet, _packetWriter); var remainingLength = _packetWriter.Length - 5; var remainingLengthBuffer = MqttPacketWriter.EncodeRemainingLength(remainingLength); var headerSize = FixedHeaderSize + remainingLengthBuffer.Count; var headerOffset = 5 - headerSize; // Position cursor on correct offset on beginining of array (has leading 0x0) _packetWriter.Seek(headerOffset); _packetWriter.Write(fixedHeader); _packetWriter.Write(remainingLengthBuffer.Array, remainingLengthBuffer.Offset, remainingLengthBuffer.Count); var buffer = _packetWriter.GetBuffer(); return(new ArraySegment <byte>(buffer, headerOffset, _packetWriter.Length - headerOffset)); }