【问题标题】:Reading code from RFID card从 RFID 卡读取代码
【发布时间】:2014-10-28 15:05:05
【问题描述】:
我在从 RFID 卡读取代码时遇到问题。
是否存在任何转换算法?
Examples of codes:
04006d0ba0 -> 00008596950352
0d001c59b3 -> 00047253268956
0d001c5134 -> 00047253268674
0d001c9317 -> 00047253265550
0d001c93ed -> 00047253265531
0d001c1b12 -> 00047253261700
0d001c1b1d -> 00047253261707
e800ef0aac -> 00485339628883
相同的 RFID 卡,来自不同读卡器的不同输出...
我知道这样的话题还存在,但我认为这不是同一个问题......
【问题讨论】:
标签:
rfid
number-formatting
【解决方案1】:
转换看起来很简单:
假设您要将“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();
}