zoukankan      html  css  js  c++  java
  • NDEF消息解析实例[转]

     
    问题:按照NDEF消息格式来解析下列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记录格式如下,
        
        
        Byte 0: D1
        0xD1 = 11010001B,对应的标志位如下:
        MB(Message Begin) = 1,说明这是首记录
        ME(Message End) = 1,说明这是末记录(说明消息只有一个记录)
        CF(Chunk Flag) = 0,说明记录未被切块
        SR(Short Record) = 1,说明这是短记录,PAYLOAD_LENGTH 占1字节
        IL(ID_LENGTH field is present) = 0,说明没有 ID_LENGTH 和 ID 域
        TNF(Type Name Format) = 1,说明TYPE类型是 NFC Forum well-known type [NFC RTD],
         下表是TNF编码对应表
        
            因为SR=1且IL=0,所以NDEF记录可简化为如下结构
            
        Byte 1: 02
        TYPE_LENGTH = 2,TYPE域长度为2
     
        Byte 2: 1F
        PAYLOAD_LENGTH = 0x1F,Payload域长度为31
     
        Byte 3-4: 53 70
        TYPE = "Sp",因为TYPE域长度为2,所以此处TYPE取2个字节
     
        此后全是PAYLOAD域的内容,因为TYPE="Sp",所以需要使用的Spec是“Smart Poster Record Type Definition”
     
       (2)智能海报的记录类型其实也是一个NDEF消息。没错,NDEF记录的PAYLOAD域可以存放任何东西,包括嵌套NDEF消息。
     
        智能海报的内容可以包括标题、URI、动作、图标、大小、类型等记录,其中URI记录是必须有的,其他的可选,次序无所谓。
     
            1)现在将智能海报的内容贴过来,如下
     
        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,对应的标志位如下:
        MB = 1,说明这是首记录
        ME = 0,说明后面还有记录
        CF = 0,说明记录未被切块
        SR = 1,说明这是短记录,PAYLOAD_LENGTH 占1字节
        IL = 0,说明没有 ID_LENGTH 和 ID 域
        TNF = 1,说明TYPE类型是 NFC Forum well-known type
        Byte 1: 01
        TYPE_LENGTH = 1,TYPE域长度为1
     
        Byte 2: 0E
        PAYLOAD_LENGTH = 0x0E,Payload域长度为14
     
        Byte 3: 54
        TYPE = "T",说明是文本记录类型,适用“Text Record Type Definition”
        Byte 4-17: 02 65 6E 68 65 6C 6C 6F 20 77 6F 72 6C 64 
        这是文本记录的内容
     
        下面对“02 65 6E 68 65 6C 6C 6F 20 77 6F 72 6C 64”按照文本记录格式解码。
     
        文本记录格式如下:
        
            
        Byte 0: 02
        Status = 2,由下表可知,IANA语言码长度=2
        
        Byte 1-2: 65 6E
        ISO/IANA语言码 = “en”,编码为US-ASCII码
     
        Byte 3-13:68 65 6C 6C 6F 20 77 6F 72 6C 64
        按照ASCII码解码可得“hello world”
     
        至此,对海报内容的第一条NDEF记录解码完成,接下来是对剩余内容解码。
     
            2)剩余内容为“51 01 09 55 01 73 69 6E 61 2E 63 6F 6D”,同样也是按照NDEF记录来解码。
     
        Byte 0: 51
        0x91 = 01010001B,对应的标志位如下:
        MB = 0,说明这不是首记录
        ME = 1,说明这是末记录
        CF = 0,说明记录未被切块
        SR = 1,说明这是短记录,PAYLOAD_LENGTH 占1字节
        IL = 0,说明没有 ID_LENGTH 和 ID 域
        TNF = 1,说明TYPE类型是 NFC Forum well-known type
        Byte 1: 01
        TYPE_LENGTH = 1,TYPE域长度为1
     
        Byte 2: 09
        PAYLOAD_LENGTH = 0x09,Payload域长度为9
     
        Byte 3: 55
        TYPE = "U",说明是URI记录类型,适用“URI Record Type Definition”
        Byte 4-12: 01 73 69 6E 61 2E 63 6F 6D
        这是URI记录的内容
     
        URI记录内容格式如下:
            
            
        Byte 0: 01
        ID码 = 1,由下表可知,对应的协议是“http://www.”
         
                         
                    
        Byte 1-8: 73 69 6E 61 2E 63 6F 6D
        按照UTF-8格式解码可得:“sina.com”
     
        至此,整个NDEF消息解码完毕。
     
        回顾一下吧,整个结构的解码将其如下分解:
     
        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                <-- URI
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    小程序之scroll-view用法
    uni-app解决小程序圆角样式不生效
    MAC设置允许任何来源
    小技巧:使用命令行打开vscode 以及 sublime 工具
  • 原文地址:https://www.cnblogs.com/BinZeng/p/4028033.html
Copyright © 2011-2022 走看看