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



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

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

该值被砍掉,并具有尾随零和前导零。这是怎么回事?

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

首先,名为mifare_classic_*的函数可能不太适合访问NTAG203标签,因为 MIFARE Classic 和 NTAG203 使用偏离的帧和命令集。

但是,PN532 使用NTAG203标签在一定程度上支持的命令集抽象了对 MIFARE 经典标签的访问。更具体地说,

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

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

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

最新更新