mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-16 01:03:01 +08:00
82 lines
2.0 KiB
C#
82 lines
2.0 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using MQTTnet.Protocol;
|
|
|
|
namespace MQTTnet.Serializer
|
|
{
|
|
public sealed class MqttPacketWriter : BinaryWriter
|
|
{
|
|
public MqttPacketWriter(Stream stream)
|
|
: base(stream, Encoding.UTF8, true)
|
|
{
|
|
}
|
|
|
|
public static byte BuildFixedHeader(MqttControlPacketType packetType, byte flags = 0)
|
|
{
|
|
var fixedHeader = (int)packetType << 4;
|
|
fixedHeader |= flags;
|
|
return (byte)fixedHeader;
|
|
}
|
|
|
|
public override void Write(ushort value)
|
|
{
|
|
var buffer = BitConverter.GetBytes(value);
|
|
Write(buffer[1], buffer[0]);
|
|
}
|
|
|
|
public new void Write(params byte[] values)
|
|
{
|
|
base.Write(values);
|
|
}
|
|
|
|
public new void Write(byte value)
|
|
{
|
|
base.Write(value);
|
|
}
|
|
|
|
public void Write(ByteWriter value)
|
|
{
|
|
if (value == null) throw new ArgumentNullException(nameof(value));
|
|
|
|
Write(value.Value);
|
|
}
|
|
|
|
public void WriteWithLengthPrefix(string value)
|
|
{
|
|
WriteWithLengthPrefix(Encoding.UTF8.GetBytes(value ?? string.Empty));
|
|
}
|
|
|
|
public void WriteWithLengthPrefix(byte[] value)
|
|
{
|
|
var length = (ushort)value.Length;
|
|
|
|
Write(length);
|
|
Write(value);
|
|
}
|
|
|
|
public static void WriteRemainingLength(int length, BinaryWriter target)
|
|
{
|
|
if (length == 0)
|
|
{
|
|
target.Write((byte)0);
|
|
return;
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
target.Write((byte)encodedByte);
|
|
} while (x > 0);
|
|
}
|
|
}
|
|
}
|