从RFID卡读取代码

时间:2014-10-28 15:05:06

标签: rfid number-formatting

我从RFID卡读取代码时遇到问题。

是否存在任何转换算法?

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

相同的RFID卡,来自不同读者的不同输出......

我知道那个话题还存在,但我认为这不是同一个问题......

1 个答案:

答案 0 :(得分:2)

转换看起来很简单:

  • 我们假设您要转换" 04006d0ba0"到" 00008596950352"。

  • 从十六进制数" 04006d0ba0"中取出每个半字节(即" 0",然后" 4",然后" 0",然后" 0",然后" 6" ,...)

  • 反转每个半字节的位(最低有效位变为最高有效位,第二位变为倒数第二位),例如, " 0" (= 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();
}