Python3实现NFC UID的Hex/Dec/Byte转换及不同读卡器读数匹配问题
NFC UID匹配验证步骤
- 第一步:修正简易读卡器的乱码输出,将所有
ö字符替换为0,得到纯数字字符串,你当前测试的标签对应结果为2077871305 - 第二步:将上述十进制数字转换为4字节长度的十六进制字符串,得到
7bd9ccc9 - 第三步:将该十六进制字符串按每2位为一组拆分,倒序排列后重新拼接,得到
c9ccd97b - 第四步:对比拼接结果和ACR122U读取的UID,二者一致即可证明两台设备读取的是同一张标签
"8 no. in HEX reverse"含义及Python实现
模式含义
该配置项的完整含义为:将读取到的4字节NFC UID(对应8个十六进制字符)按字节序反转后,输出为十六进制格式的结果。其中8 no.指代UID对应的8个十六进制字符,reverse指代字节序反转操作,也就是常说的大小端转换。
你遇到的输出差异本质是两台设备的默认输出规则不同:
- ACR122U默认输出大端序的十六进制UID
- 简易读卡器默认输出小端序UID对应的十进制值,且在非Windows系统下会因为编码映射问题将
0显示为ö
Python实现转换逻辑
从ACR122U结果转换为简易读卡器输出
# ACR122U读取到的UID acr_uid = "c9ccd97b" # 转字节后反转字节序,再转十进制整数 reader_output = int.from_bytes(bytes.fromhex(acr_uid)[::-1], byteorder="big") print(reader_output) # 输出结果:2077871305
从简易读卡器输出转换为ACR122U结果
# 替换乱码后的简易读卡器输出 reader_output = "2077871305" # 转4字节后反转字节序,再转十六进制字符串 acr_uid = int(reader_output).to_bytes(4, byteorder="big")[::-1].hex() print(acr_uid) # 输出结果:c9ccd97b
内容的提问来源于stack exchange,提问作者Gábor Erdős
相关产品推荐
相关产品推荐

