問(wèn)題:按照NDEF消息格式來(lái)解析下列Hex串?
D1 02 1F 53 70 91 01 0E 54 02
65 6E 68 65 6C 6C 6F 20 77 6F
72 6C 64 51 01 09 55 01 73 69
6E 61 2E 63 6F 6D
解答:
(1)NDEF記錄格式如下,

(1)NDEF記錄格式如下,

Byte 0: D1
0xD1 = 11010001B,對(duì)應(yīng)的標(biāo)志位如下:
MB(Message Begin) = 1,說(shuō)明這是首記錄
ME(Message End) = 1,說(shuō)明這是末記錄(說(shuō)明消息只有一個(gè)記錄)
CF(Chunk Flag) = 0,說(shuō)明記錄未被切塊
SR(Short Record) = 1,說(shuō)明這是短記錄,PAYLOAD_LENGTH 占1字節(jié)
IL(ID_LENGTH field is present) = 0,說(shuō)明沒(méi)有 ID_LENGTH 和 ID 域
TNF(Type Name Format) = 1,說(shuō)明TYPE類型是 NFC Forum well-known type [NFC RTD],
下表是TNF編碼對(duì)應(yīng)表
因?yàn)镾R=1且IL=0,所以NDEF記錄可簡(jiǎn)化為如下結(jié)構(gòu)
下表是TNF編碼對(duì)應(yīng)表

因?yàn)镾R=1且IL=0,所以NDEF記錄可簡(jiǎn)化為如下結(jié)構(gòu)

Byte 1: 02
TYPE_LENGTH = 2,TYPE域長(zhǎng)度為2
Byte 2: 1F
PAYLOAD_LENGTH = 0x1F,Payload域長(zhǎng)度為31
Byte 3-4: 53 70
TYPE = "Sp",因?yàn)門YPE域長(zhǎng)度為2,所以此處TYPE取2個(gè)字節(jié) 此后全是PAYLOAD域的內(nèi)容,因?yàn)門YPE="Sp",所以需要使用的Spec是“Smart Poster Record Type Definition”
(2)智能海報(bào)的記錄類型其實(shí)也是一個(gè)NDEF消息。沒(méi)錯(cuò),NDEF記錄的PAYLOAD域可以存放任何東西,包括嵌套NDEF消息。
智能海報(bào)的內(nèi)容可以包括標(biāo)題、URI、動(dòng)作、圖標(biāo)、大小、類型等記錄,其中URI記錄是必須有的,其他的可選,次序無(wú)所謂。
1)現(xiàn)在將智能海報(bào)的內(nèi)容貼過(guò)來(lái),如下
91 01 0E 54 02 65 6E 68 65 6C
6C 6F 20 77 6F 72 6C 64 51 01
09 55 01 73 69 6E 61 2E 63 6F
6D
Byte 0: 91
0x91 = 10010001B,對(duì)應(yīng)的標(biāo)志位如下:
MB = 1,說(shuō)明這是首記錄
ME = 0,說(shuō)明后面還有記錄
CF = 0,說(shuō)明記錄未被切塊
SR = 1,說(shuō)明這是短記錄,PAYLOAD_LENGTH 占1字節(jié)
IL = 0,說(shuō)明沒(méi)有 ID_LENGTH 和 ID 域
TNF = 1,說(shuō)明TYPE類型是 NFC Forum well-known type
Byte 1: 01
TYPE_LENGTH = 1,TYPE域長(zhǎng)度為1
Byte 2: 0E
PAYLOAD_LENGTH = 0x0E,Payload域長(zhǎng)度為14
Byte 3: 54
TYPE = "T",說(shuō)明是文本記錄類型,適用“Text Record Type Definition” Byte 4-17: 02 65 6E 68 65 6C 6C 6F 20 77 6F 72 6C 64
這是文本記錄的內(nèi)容
下面對(duì)“02 65 6E 68 65 6C 6C 6F 20 77 6F 72 6C 64”按照文本記錄格式解碼。
文本記錄格式如下:


Byte 0: 02
Status = 2,由下表可知,IANA語(yǔ)言碼長(zhǎng)度=2


Byte 1-2: 65 6E
ISO/IANA語(yǔ)言碼 = “en”,編碼為US-ASCII碼
Byte 3-13:68 65 6C 6C 6F 20 77 6F 72 6C 64
按照ASCII碼解碼可得“hello world”
至此,對(duì)海報(bào)內(nèi)容的第一條NDEF記錄解碼完成,接下來(lái)是對(duì)剩余內(nèi)容解碼。
2)剩余內(nèi)容為“51 01 09 55 01 73 69 6E 61 2E 63 6F 6D”,同樣也是按照NDEF記錄來(lái)解碼。
Byte 0: 51
0x91 = 01010001B,對(duì)應(yīng)的標(biāo)志位如下:
MB = 0,說(shuō)明這不是首記錄
ME = 1,說(shuō)明這是末記錄
CF = 0,說(shuō)明記錄未被切塊
SR = 1,說(shuō)明這是短記錄,PAYLOAD_LENGTH 占1字節(jié)
IL = 0,說(shuō)明沒(méi)有 ID_LENGTH 和 ID 域
TNF = 1,說(shuō)明TYPE類型是 NFC Forum well-known type
Byte 1: 01
TYPE_LENGTH = 1,TYPE域長(zhǎng)度為1
Byte 2: 09
PAYLOAD_LENGTH = 0x09,Payload域長(zhǎng)度為9
Byte 3: 55
TYPE = "U",說(shuō)明是URI記錄類型,適用“URI Record Type Definition” Byte 4-12: 01 73 69 6E 61 2E 63 6F 6D
這是URI記錄的內(nèi)容
URI記錄內(nèi)容格式如下:

Byte 0: 01
ID碼 = 1,由下表可知,對(duì)應(yīng)的協(xié)議是“http://www.”




Byte 1-8: 73 69 6E 61 2E 63 6F 6D
按照UTF-8格式解碼可得:“sina.com”
至此,整個(gè)NDEF消息解碼完畢。
回顧一下吧,整個(gè)結(jié)構(gòu)的解碼將其如下分解:
D1 02 1F 53 70 <-- 智能海報(bào)
91 01 0E 54 02 65 6E 68 65 6C 6C 6F 20 77 6F 72 6C 64 <-- 文本
51 01 09 55 01 73 69 6E 61 2E 63 6F 6D <-- URI