当有效负载大于 1 字节时,NDEF Header 如何工作?

How does the NDEF Header work when the Payload is bigger than 1 Byte?

我想了解我所拥有的 Mifare Ultralight 芯片的工作原理。此页面几乎解释了正常情况下的情况:https://learn.adafruit.com/adafruit-pn532-rfid-nfc/ndef(在页面的最后)

但是现在我遇到了问题,我想在芯片上写入大于254 Byte的数据。 例如,我在上面写了 493 'A's(使用 7 字节 Header,数据总共为 500 字节)。 这是我从读取芯片中得到的结果(数字是十进制的,而不是十六进制的,所以它会说“255”而不是“0xFF”):

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 Message”,然后我得到大小。

例如,如果我只在芯片上写一个'A',则给定的大小将是 1 Byte payload + 7 Byte header = 8 Byte overall。所以第 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's 时,总大小将是 255 字节,这会将第 5 个块更改为:

4:________  3 255   0 255 144   0

首先,我认为这表明我需要计算 x * y + z,在此示例中,x = 255、y = 0 和 z = 255,因此 255 * 0 + 255 会给我255,整体大小,但是当我添加一个'A',所以大小是256字节,header变为:

4:________  3 255   1   0 144   0

这再次表明计算结果为 x * y + y + z, 255*1+1+0 = 256.

但是话又说回来,当我使用 659 'A's 得到 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 的信息时感到困惑,因为它不是所有可能性的完整规范,而是针对 Mifare Classic 1K 卡 的不是 NFC 标准型芯片,与 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 Type 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 link 不适合您的芯片,并提供非常简单的解释。

另请注意,以十进制而不是标准的十六进制编写数字会导致阅读起来非常困难,因为大多数规格均以十六进制详细说明。

我发现了。 不是乘加法,而是用二进制看。

首先,第一个完整字节不直接包含在计算中。 重要的是其他两个字节。

在476字节的例子中,我得到了

4:________  3 255   1 223 144   0

这意味着我必须以二进制形式查看 1223

  1 = 0000 0001
223 = 1101 1111

现在我必须将它们合并在一起:

0000 0001 1101 1111 = 479

如果总大小超过 259 字节,将添加 3 个额外字节(我知道为什么,但这就是我的芯片的工作方式。它使用 1 或 4 个字节,具体取决于大小)

另一个例子是 666 + 3 Byte = 669:

4:________  3 255   2 157 144   0

  2 = 0000 0010
157 = 1001 1101

Total: 0000 0010 1001 1101 = 669