1

我正在尝试将一个字节数组从十六进制字符串转换到 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

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

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

4

1 回答 1

1

首先,命名函数mifare_classic_*可能不太适合访问 NTAG203 标签,因为 MIFARE 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 个字节(一个块)。因此,由于您仍然需要在写入命令中提供 16 个字节的数据,因此只写入前 4 个字节。

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

于 2018-01-25T17:52:07.657 回答