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

Byte array gets truncated when writing to memory of RFID tag using Adafruit PN532 library

我正在尝试写入一个从十六进制字符串转换为 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

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

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

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

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

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

  • NTAG203 支持 MIFARE Classic WRITE 命令作为 COMPATIBILITY WRITE c 命令。唯一的区别是您只能在 NTAG203 上写入 4 个字节(一个块)。因此,由于您仍然需要在写入命令中提供 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 上编程的初始内存内容相匹配。