說明如何將 HID Card Reader 取得的 Hex String 轉換為 Binary String,並且從中找到 Card Number 以及 Facility Code。
說明
using System.Linq;
static String ChunkSplit(string str, int chunkSize)
{
return String.Join(" ", Enumerable.Range(0, str.Length / chunkSize)
.Select(i => str.Substring(i * chunkSize, chunkSize)));
}
static String HexToBinaryString(string input)
{
return String.Join(String.Empty,
input.Select(
c => Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2).PadLeft(4, '0')
)
);
}
其中 input
為 HID Card Reader 取得的 Hex String,先藉由自定義的 HexToBinaryString
轉換為 Binary String。
string input = "04 83 C5 60".ToUpper().Replace(" ","");
var binarystring = HexToBinaryString(input);
接著使用 IndexOf
找到已知的 Card Number Decimal 並轉換為 Binary String 的方式檢查是否存在。
binarystring.IndexOf(Convert.ToString(1930, 2));
如果要觀察 Binary String 4 Bits 一組的切割,可以使用下列方式呈現:
Console.WriteLine(ChunkSplit(binarystring, 4));
Console.WriteLine(Convert.ToInt32(cn.Replace(" ", ""), 2));
實測 Readre 取得的 04 83 C5 60 尋找 Card Number:
04 83 C5 60
0000 0100 1000 0011 1100 0101 0110 0000
1930 011 1100 0101 0
由上述觀察得知,Card Number 會位於 index 13 以及其後共 12 碼,取得 Binary String 後可以再轉回 10 進位,得到 Card Number 為 1930。
string cn = binarystring.Substring(13, 12);
Convert.ToInt32(cn.Replace(" ", ""), 2);
參考資料
How to convert 26 Bit Format(H10301 ) HID proximity card S/N read by ACTAtek device?
Emulating an HID Proxcard from Facility Code and Card Number