我从RFID卡读取代码时遇到问题。
是否存在任何转换算法?
Examples of codes:
04006d0ba0 -> 00008596950352
0d001c59b3 -> 00047253268956
0d001c5134 -> 00047253268674
0d001c9317 -> 00047253265550
0d001c93ed -> 00047253265531
0d001c1b12 -> 00047253261700
0d001c1b1d -> 00047253261707
e800ef0aac -> 00485339628883
相同的RFID卡,来自不同读者的不同输出......
我知道那个话题还存在,但我认为这不是同一个问题......
答案 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();
}