OSDP.Net 5.2.1
A .NET library for implementing the Open Supervised Device Protocol (OSDP)
Loading...
Searching...
No Matches
MessageDataFragment.cs
1using System;
2using System.Collections.Generic;
4
6{
23
28 {
29 private readonly MessageDataFragmentFieldSize _sizeAndOffsetFieldSize;
30
39 public MessageDataFragment(int totalSize, int offset, ushort fragmentSize, byte[] dataFragment,
40 MessageDataFragmentFieldSize sizeAndOffsetFieldSize)
41 {
42 TotalSize = totalSize;
43 Offset = offset;
44 FragmentSize = fragmentSize;
45 DataFragment = dataFragment;
46 _sizeAndOffsetFieldSize = sizeAndOffsetFieldSize;
47 }
48
52 public int TotalSize { get; }
53
57 public int Offset { get; }
58
62 public ushort FragmentSize { get; }
63
67 public byte[] DataFragment { get; }
68
69 internal ReadOnlySpan<byte> BuildData()
70 {
71 var useTwoByteFields = _sizeAndOffsetFieldSize == MessageDataFragmentFieldSize.TwoBytes;
72 var data = new List<byte>();
73 data.AddRange(useTwoByteFields ? Message.ConvertShortToBytes((ushort)TotalSize) : Message.ConvertIntToBytes(TotalSize));
74 data.AddRange(useTwoByteFields ? Message.ConvertShortToBytes((ushort)Offset) : Message.ConvertIntToBytes(Offset));
75 data.AddRange(Message.ConvertShortToBytes(FragmentSize));
76 data.AddRange(DataFragment);
77 return data.ToArray();
78 }
79
84 public static MessageDataFragment ParseData(ReadOnlySpan<byte> data,
85 MessageDataFragmentFieldSize sizeAndOffsetFieldSize)
86 {
87 var dataOffset = 0;
88
89 var totalSize = ReadValue(sizeAndOffsetFieldSize, data, ref dataOffset);
90 var offset = ReadValue(sizeAndOffsetFieldSize, data, ref dataOffset);
91 var fragmentSize = (ushort)ReadValue(MessageDataFragmentFieldSize.TwoBytes, data, ref dataOffset);
92 var fragmentData = data.Slice(dataOffset).ToArray();
93
94 return new MessageDataFragment(
95 totalSize,
96 offset,
97 fragmentSize,
98 fragmentData,
99 sizeAndOffsetFieldSize);
100
101 static int ReadValue(MessageDataFragmentFieldSize fieldSize, ReadOnlySpan<byte> data, ref int offset)
102 {
103 switch (fieldSize)
104 {
105 case MessageDataFragmentFieldSize.TwoBytes:
106 var twoByteValue = Message.ConvertBytesToUnsignedShort(data.Slice(offset, 2));
107 offset += 2;
108 return twoByteValue;
109 case MessageDataFragmentFieldSize.FourBytes:
110 var fourByteValue = Message.ConvertBytesToInt(data.Slice(offset, 4).ToArray());
111 offset += 4;
112 return fourByteValue;
113 default:
114 throw new ArgumentOutOfRangeException(nameof(fieldSize), fieldSize, null);
115 }
116 }
117 }
118 }
119}
A base message class for sending or replying.
Definition Message.cs:12
ushort FragmentSize
Get the size of the fragment.
MessageDataFragment(int totalSize, int offset, ushort fragmentSize, byte[] dataFragment, MessageDataFragmentFieldSize sizeAndOffsetFieldSize)
Initializes a new instance of the MessageDataFragment class.
int Offset
Get the offset of the current message.
int TotalSize
Get the total message data size as little-endian format.
static MessageDataFragment ParseData(ReadOnlySpan< byte > data, MessageDataFragmentFieldSize sizeAndOffsetFieldSize)
Parses the message payload bytes.
MessageDataFragmentFieldSize
Defines the field size used for the MessageDataFragment.TotalSize and MessageDataFragment....