diff --git a/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketSerializer.cs b/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketSerializer.cs index 8225e60..6848330 100644 --- a/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketSerializer.cs +++ b/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketSerializer.cs @@ -24,19 +24,18 @@ namespace MQTTnet.Serializer { // Leave enough head space for max header size (fixed + 4 variable remaining length) stream.Position = 5; - var fixedHeader = SerializePacket(packet, writer); - var remainingLength = MqttPacketWriter.EncodeRemainingLength((int)stream.Length - 5); + stream.Position = 1; + var remainingLength = MqttPacketWriter.EncodeRemainingLength((int)stream.Length - 5, stream); - var headerSize = remainingLength.Length + 1; + var headerSize = remainingLength + 1; var headerOffset = 5 - headerSize; // Position cursor on correct offset on beginining of array (has leading 0x0) stream.Position = headerOffset; writer.Write(fixedHeader); - writer.Write(remainingLength, 0, remainingLength.Length); #if NET461 || NET452 || NETSTANDARD2_0 var buffer = stream.GetBuffer(); diff --git a/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketWriter.cs b/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketWriter.cs index 3de4961..368d224 100644 --- a/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketWriter.cs +++ b/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketWriter.cs @@ -56,14 +56,18 @@ namespace MQTTnet.Serializer Write(value); } - public static byte[] EncodeRemainingLength(int length) + public static int EncodeRemainingLength(int length,MemoryStream stream) { + //write the encoded remaining length right aligned on the 4 byte buffer + if (length <= 0) { - return new[] { (byte)0 }; + stream.Seek(3, SeekOrigin.Current); + stream.WriteByte(0); + return 1; } - var bytes = new byte[4]; + byte[] buffer = new byte[4]; var offset = 0; // Alorithm taken from http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html. @@ -77,13 +81,15 @@ namespace MQTTnet.Serializer encodedByte = encodedByte | 128; } - bytes[offset] = (byte)encodedByte; + buffer[offset] = (byte)encodedByte; offset++; } while (x > 0); - Array.Resize(ref bytes, offset); - return bytes; + stream.Seek(4 - offset, SeekOrigin.Current); + stream.Write(buffer, 0, offset); + + return offset; } } }