2using System.Collections;
48 public BitArray
Data {
get; }
67 var dataArray = data.ToArray();
68 if (dataArray.Length < 4)
70 throw new Exception(
"Invalid size for the data");
73 ushort bitCount =
Message.ConvertBytesToUnsignedShort(
new[] {dataArray[2], dataArray[3]});
74 var cardData =
new BitArray(dataArray.Skip(4).Take(dataArray.Length - 4).Reverse().ToArray());
76 cardData.Length = bitCount;
84 var build =
new StringBuilder();
85 build.AppendLine($
"Reader Number: {ReaderNumber}");
86 build.AppendLine($
" Format Code: {Helpers.SplitCamelCase(FormatCode.ToString())}");
87 build.AppendLine($
" Bit Count: {BitCount}");
88 build.AppendLine($
" Binary Data: {FormatData(Data)}");
89 build.AppendLine($
" Hex Data: {FormatHexData(Data)}");
90 return build.ToString();
93 internal static string FormatData(BitArray bitArray)
95 var builder =
new StringBuilder();
96 foreach (
bool bit
in bitArray)
98 builder.Append(bit ?
"1" :
"0");
101 return builder.ToString();
108 internal static string FormatHexData(BitArray bitArray)
110 var bytes =
new byte[(bitArray.Length + 7) / 8];
111 for (
int index = 0; index < bitArray.Length; index++)
115 bytes[index / 8] |= (byte)(0x80 >> (index % 8));
119 return BitConverter.ToString(bytes).Replace(
"-",
string.Empty);
122 private static void Reverse(BitArray array)
124 int length = array.Length;
125 int mid = length / 2;
127 for (
int index = 0; index < mid; index++)
129 (array[index], array[length - index - 1]) = (array[length - index - 1], array[index]);
136 var length = 4 + (Data.Count + 7) / 8;
137 var buffer =
new byte[length];
140 buffer[2] = (byte)(
BitCount & 0xff);
141 buffer[3] = (byte)((
BitCount >> 8) & 0xff);
142 Data.CopyTo(buffer, 4);
144 for (
int i = 4; i < length; i++)
150 int c = (byte)((b >> 4) | ((b & 0xf) << 4));
151 c = ((c & 0xcc) >> 2) | ((c & 0x33) << 2);
152 c = ((c & 0xaa) >> 1) | ((c & 0x55) << 1);
A base message class for sending or replying.
Contains standard Security Control Block data that can be used when building messages.
Base class representing a payload an OSDP message.
override string ToString()
RawCardData(byte readerNumber, FormatCode format, BitArray data)
Creates a new instance of RawCardData.
FormatCode FormatCode
The card format code.
BitArray Data
The raw card data.
ushort BitCount
The bit count returned by the card.
override byte[] BuildData()
byte ReaderNumber
The reader number.
override ReadOnlySpan< byte > SecurityControlBlock()
static RawCardData ParseData(ReadOnlySpan< byte > data)
Parses the data.
ReplyType
Identifies the type of OSDP protocol reply (PD -> ACU) message.
FormatCode
The raw card format code.
@ NotSpecified
Card format not specified.
@ Wiegand
Wiegand card format.