【问题标题】:Interpreting Mangled NDEF Header解释损坏的 NDEF 标头
【发布时间】:2019-03-08 16:09:49
【问题描述】:

我正在修改我编写的一个 PC 软件,以从 NFC 标签读取多个 NDEF 记录。但是,我拥有的其中一个标签包含一条似乎是损坏的 NDEF 标头的记录。这是 6 条记录中的最后一条记录,其他 5 条按预期出现。我在下面列出了它。为简单起见,所有值都以十六进制列出,并且有效负载已被截断。

记录 #6

Header:     42
Type Length:    03
Random Bytes:   00 00 00
Payload Length: 2C (44)
Rec. Type:      6E 2F 70 (n/p)
Payload:        **

如您所见,3 个随机零字节被塞入应该是类型长度和有效负载长度之间。我仔细检查了 TLV 中的长度字段,发现它占了这 3 个字节。由于这些添加的字节,我没有从 TLV 末尾截断任何数据。

我决定使用 NXP 的 TagInfo 应用程序进行完整性检查,以确保我不只是错误地读取数据。从全扫描检查数据转储,我看到数据确实匹配。我在下面列出了内存扫描。仅列出相关数据点,并且有效负载再次被截断。

内存转储

addr    data
...
[30]    -- -- 42 03 |--B.|
[31]    00 00 00 2C |...,|
[32]    6E 2F 70 ** |n/p*|
[33]    ** ** ** ** |****|
...                  
[3D]    ** ** ** FE |***.|
...

我们认为这可能是填充问题,因为在这种情况下,终结者 TLV 出现在页面 0x3D 的末尾。然而,由于以前记录的性质,情况并非总是如此。有时,终结者 TLV 会显示在页面中间。

但是,奇怪的是,在同一个TagInfo应用中,在NDEF页面上,它报告了NDEF消息如下。

NDEF 消息

...
[A8] 52 03 2C 6E 2F 70 ** ** |R.,n/p**|
[B0] ** ** ** ** ** ** ** ** |********|
...
[D8] ** **                   |**      |
...

不知何故,软件不仅删除了额外的 3 个字节,而且还正确设置了 NDEF 标头中的 SR 位。我已经用 Android 上的另一个 NFC 应用仔细检查了这一点,并确认另一个应用也能够以这种方式读取 NDEF 消息。

我的问题是,应用程序如何不仅能够更正添加的字节,而且能够更正 NDEF 标头,背后是否有原因或逻辑?我不确定这是 Android 在进行更正还是在 NDEF 消息结构中进行更深层次的操作。无论哪种方式,我都在寻找正确的方法来进行更正,同时不影响我如何阅读此标签中保存的其他 5 条记录。

【问题讨论】:

    标签: format nfc ndef


    【解决方案1】:

    这些字节也是有效载荷长度的一部分

    如果记录没有设置SR(短记录)位,则有效负载长度为 4 个字节而不是 1 个字节。

    https://learn.adafruit.com/adafruit-pn532-rfid-nfc/ndef#payload-length-9-9

    第一个字节是 0x42,二进制是0100 0010。如果我们将其分开,我们可以看到记录设置了ME(或“消息结束”)位,以及0x02 - 'MIME 媒体记录的TNF('类型名称格式') '。 SR 位是第 4 位,在这种情况下为零。

    这也是为什么它们在 TagInfo 应用更正的版本中消失的原因 - 它设置了 SR(这就是标头跳转到 0x52 的原因)并删除了不必要的字节。

    【讨论】:

    • 哦,Adafruit 没有提到 payload 是 little-endian。之后我看到了零,并认为一定是出了什么问题。
    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多