问题描述
我正在尝试了解mifare超轻芯片的工作原理。正常情况下,该页面对此进行了解释:https://learn.adafruit.com/adafruit-pn532-rfid-nfc/ndef(在页面的最后)
但是现在我有一个问题,我想在大于254字节的芯片上写入数据。 举例来说,我在上面写了493'A'(带有7字节的标头,数据总共为500字节)。 这是我从读取芯片后得到的信息(数字以十进制表示,而不是十六进制,因此代替“ 0xFF”时,它会显示“ 255”):
0:________ 4 34 42 132 144 0
1:________186 144 107 129 144 0
2:________192 72 0 0 144 0
3:________225 16 109 0 144 0
4:________ 3 255 1 247 144 0
5:________193 1 0 0 144 0
6:________ 1 240 84 2 144 0
7:________101 110 65 65 144 0
8:________ 65 65 65 65 144 0 ...`
我了解的是,前4个块是Header,其中包含序列号等。 然后第五块以3开头,表示“ NDEF消息”,然后我得到大小。
例如,如果我只在芯片上写一个“ A”,则给定的大小将是1字节有效负载+ 7字节报头=总共8字节。因此,第5块看起来像这样:
4:________ 3 8 209 1 144 0
(As the size doesn't exceed 254 byte,the 209 and 1 are not part of that size byte anymore)
但是当我写248'A'时,总大小将为255字节,这将第5个块更改为:
4:________ 3 255 0 255 144 0
首先,我认为这表明我需要计算x * y + z
,在此示例中,x = 255,y = 0和z = 255,因此255 * 0 + 255导致我得到255,整体大小,但是当我加一个“ A”,因此大小为256字节时,标头更改为:
4:________ 3 255 1 0 144 0
这将再次表明计算为x * y + y + z
,即255 * 1 + 1 + 0 = 256。
但是再说一次,当我使用659'A获得666字节时,我得到了:
4:________ 3 255 2 157 144 0
这对于以下两种算法都不起作用:
255*2+157 = 667
255*2+2+157 = 669
最后一个例子:476字节:
4:________ 3 255 1 223 144 0
255 * 1 + 223 = 478
255 * 1 + 1 + 223 = 479
任何人都可以向我解释我做错了什么,或者为什么我无法获得使我回到总体规模的正确算法?
解决方法
如果没有确切的芯片类型然后再检查数据表,这很难回答。
但是我认为您可能会从Adafruit读取信息而感到困惑,因为这不是所有可能性的完整规范,而是针对不是NFC标准类型的 Mifare Classic 1K卡芯片,与 Ultralight 不同。 NDEF消息在此芯片上的放置方式对于 Classic 卡而言是有利的,有关详细信息,请参见https://www.nxp.com/docs/en/application-note/AN1304.pdf
对于 Utralight 芯片与NFC Type 2规范兼容,请参见https://www.nxp.com/docs/en/application-note/AN1303.pdf
有关完整的NFC 2类规范,请访问http://apps4android.org/nfc-specifications/NFCForum-TS-Type-2-Tag_1.1.pdf
完整的NDEF规范也可以在https://github.com/haldean/ndef/blob/master/docs/NFCForum-TS-NDEF_1.0.pdf
获得。因此,有许多因素会影响大小计算,包括标准记录不足,分块等。
希望您能阅读所有正确的文档,因为Adafruit链接不适用于您的芯片,并且解释非常简单。
还请注意,由于大多数规格都在十六进制中进行了详细说明,因此用十进制而不是标准十六进制写数字会非常困难。
,我发现了。 这不是乘法和加法,而是以二进制形式查看。
首先,第一个完整字节不直接包含在计算中。 什么是其他两个字节。
在476字节示例中,我得到了
4:________ 3 255 1 223 144 0
这意味着我必须以二进制形式查看1
和223
:
1 = 0000 0001
223 = 1101 1111
现在我必须将它们合并在一起
0000 0001 1101 1111 = 479
如果整体大小超过259字节,则会添加3个额外的字节(idk为什么,但这是我的芯片的工作方式。它使用1或4个字节,具体取决于大小)
另一个示例是666 + 3字节= 669:
4:________ 3 255 2 157 144 0
2 = 0000 0010
157 = 1001 1101
Total: 0000 0010 1001 1101 = 669