2014-10-28 78 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(); 
}