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

问题描述

我正在尝试了解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

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

  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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...