HID Data Format

2022-07-28

說明如何將 HID Card Reader 取得的 Hex String 轉換為 Binary String,並且從中找到 Card Number 以及 Facility Code。

logo

說明

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