public ArraySegment <byte> Encode(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(5); _packetWriter.Seek(5); var fixedHeader = EncodePacket(packet, _packetWriter); var remainingLength = (uint)(_packetWriter.Length - 5); var remainingLengthSize = MqttPacketWriter.GetLengthOfVariableInteger(remainingLength); var headerSize = FixedHeaderSize + remainingLengthSize; var headerOffset = 5 - headerSize; // Position cursor on correct offset on beginning of array (has leading 0x0) _packetWriter.Seek(headerOffset); _packetWriter.Write(fixedHeader); _packetWriter.WriteVariableLengthInteger(remainingLength); var buffer = _packetWriter.GetBuffer(); return(new ArraySegment <byte>(buffer, headerOffset, _packetWriter.Length - headerOffset)); }