mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-15 00:15:15 +08:00
81 lines
2.2 KiB
C#
81 lines
2.2 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using MQTTnet.Protocol;
|
|
|
|
namespace MQTTnet.Serializer
|
|
{
|
|
public static class MqttPacketWriter
|
|
{
|
|
public static byte BuildFixedHeader(MqttControlPacketType packetType, byte flags = 0)
|
|
{
|
|
var fixedHeader = (int)packetType << 4;
|
|
fixedHeader |= flags;
|
|
return (byte)fixedHeader;
|
|
}
|
|
|
|
public static void Write(this Stream stream, ushort value)
|
|
{
|
|
var buffer = BitConverter.GetBytes(value);
|
|
stream.WriteByte(buffer[1]);
|
|
stream.WriteByte(buffer[0]);
|
|
}
|
|
|
|
public static void Write(this Stream stream, ByteWriter value)
|
|
{
|
|
if (value == null) throw new ArgumentNullException(nameof(value));
|
|
|
|
stream.WriteByte(value.Value);
|
|
}
|
|
|
|
public static void WriteWithLengthPrefix(this Stream stream, string value)
|
|
{
|
|
stream.WriteWithLengthPrefix(Encoding.UTF8.GetBytes(value ?? string.Empty));
|
|
}
|
|
|
|
public static void WriteWithLengthPrefix(this Stream stream, byte[] value)
|
|
{
|
|
var length = (ushort)value.Length;
|
|
|
|
stream.Write(length);
|
|
stream.Write(value, 0, length);
|
|
}
|
|
|
|
public static int EncodeRemainingLength(int length, MemoryStream stream)
|
|
{
|
|
// write the encoded remaining length right aligned on the 4 byte buffer
|
|
|
|
if (length <= 0)
|
|
{
|
|
stream.Seek(3, SeekOrigin.Current);
|
|
stream.WriteByte(0);
|
|
return 1;
|
|
}
|
|
|
|
var 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.
|
|
var x = length;
|
|
do
|
|
{
|
|
var encodedByte = x % 128;
|
|
x = x / 128;
|
|
if (x > 0)
|
|
{
|
|
encodedByte = encodedByte | 128;
|
|
}
|
|
|
|
buffer[offset] = (byte)encodedByte;
|
|
|
|
offset++;
|
|
} while (x > 0);
|
|
|
|
stream.Seek(4 - offset, SeekOrigin.Current);
|
|
stream.Write(buffer, 0, offset);
|
|
|
|
return offset;
|
|
}
|
|
}
|
|
}
|