2014-10-28 103 views
0

我從讀取RFID卡的代碼時遇到問題。從RFID卡讀取代碼

是否存在任何轉換算法?

Examples of codes: 
04006d0ba0 -> 00008596950352 
0d001c59b3 -> 00047253268956 
0d001c5134 -> 00047253268674 
0d001c9317 -> 00047253265550 
0d001c93ed -> 00047253265531 
0d001c1b12 -> 00047253261700 
0d001c1b1d -> 00047253261707 
e800ef0aac -> 00485339628883 

同RFID卡,從不同的讀者不同的輸出...

我知道這個話題一樣存在,但我認爲這是不一樣的問題......

回答

2

轉換外觀相當簡單:

  • 我們假設您要將「04006d0ba0」轉換爲「00008596950352」。

  • 取每個半字節從十六進制數 「04006d0ba0」(即 「0」,然後是 「4」,然後 「0」,則 「0」,然後是 「6」,...)

  • 反轉每個半字節的位(最低有效位變爲最高有效位,第二位變成最後一位),例如(= 0000)爲「0」(= 0000),「4」(= 0100)變爲「2」(= 0010),「6」(= 0110)保持爲「6」(= 0110

  • 轉換成十進制數字格式。

在Java中,這可能是這個樣子:

private static final byte[] REVERSE_NIBBLE = { 
     0x00, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E, 
     0x01, 0x09, 0x05, 0x0D, 0x03, 0x0B, 0x07, 0x0F 
}; 

private long convert(byte[] input) { 
    byte[] output = new byte[input.length]; 

    for (int i = 0; i < input.length; ++i) { 
     output[i] = (byte)((REVERSE_NIBBLE[(output[i] >>> 4) & 0x0F] << 4) | 
          REVERSE_NIBBLE[ output[i]  & 0x0F]); 
    } 

    return new BigInteger(1, output).longValue(); 
}