使用Adafruit PN532库写入RFID标签的内存时,字节数组会被截断

时间:2018-01-23 15:05:58

标签: python nfc rfid mifare adafruit

我试图编写一个从十六进制字符串转换为NTAG203 RFID标签内存的字节数组。我使用的是Raspberry Pi 3,PN532芯片和Adafruit PN532 python library

hex_string = '59e7168f267df300018e15b0'
formatted_hex = bytearray.fromhex(hex_string)

byte_data = bytearray(16)
byte_data[3:15] = formatted_hex

if not pn532.mifare_classic_write_block(4, byte_data):
    print('Error! Failed to write to the card.')
    sys.exit(-1)

当我pn532.mifare_classic_read_block(4)再次从内存中读取值时,它会出现如下:

print '0x{0}'.format(binascii.hexlify(<function call result>))
>>> 0x00000059440300fe0000000000000000

该值被截断并具有尾随和前导零。这里发生了什么?

我希望能够再次将值转换回十六进制,以便用它来搜索数据库。

1 个答案:

答案 0 :(得分:1)

首先,名为mifare_classic_*的函数可能不适合访问NTAG203标记,因为MIF​​ARE Classic和NTAG203使用偏离的框架和命令集。

然而,PN532使用NTAG203标签稍微支持的命令集抽象访问MIFARE Classic标签。更具体地说,

  • READ命令是相同的(从给定的块编号开始读取16字节的数据)。唯一的区别是NTAG203上的内存组织与MIFARE Classic相比。虽然MIFARE Classic每块有16个字节,但NTAG203每个块只有4个字节。因此,READ命令返回4个连续的块。

  • NTAG203支持MIFARE Classic WRITE命令作为COMPATIBILITY WRITE c命令。唯一的区别是你只能在NTAG203上写4个字节(一个块)。因此,由于您仍需要在write命令中提供16个字节的数据,因此只写入前4个字节。

这正是您所观察到的:pn532.mifare_classic_write_block(4, byte_data)仅将byte_data的前4个字节写入块4.请注意,前4个字节为00 00 00 59,因为您复制{{1}切片formatted_hex并将字节0..2保留为默认值0.由于READ命令读取16个字节(4个块,每个4个字节),因此读取数据还包含一些旧的内存内容。块5..7:3:15。该值看起来合理,因为它与NTAG203上工厂编程的初始存储器内容相匹配。