9、NFC技術:NDEF文本格式解析


NDEF文本格式規范

      不管什么格式的數據本質上都是由一些字節組成的。對於NDEF文本格式來說。這些數據的第1個字節描述了數據的狀態,然后若干個字節描述文本的語言編碼,最后剩余字節表示文本數據。這些數據格式由NFC Forum的相關規范定義,可以從下面的地址下載相關的規范。

http://www.nfc-forum.org/specs/spec_dashboard

NDEF文本數據格式
狀態字節編碼格式
判斷數據是否為NDEF格式

      獲取NFC標簽中的數據要通過NdefRecord.getPayload方法完成。當然,在處理這些數據之前,最好判斷一下NdefRecord對象中存儲的是不是NDEF文本格式數據。

判斷的標准有如下兩個

 TNF(類型名格式,Type Name Format)必須是NdefRecord.TNF_WELL_KNOWN。

 可變的長度類型必須是NdefRecord.RTD_TEXT。

 
 1 import java.util.Arrays;
 2 import android.nfc.NdefRecord;
 3 
 4 /**
 5  * 將NDEFRecord 文本數據解析出來,生成TextRecord對象
 6  * @author dr
 7  *
 8  */
 9 public class TextRecord {
10     // 解析出來文本放到該對象中。
11     private final String mText;
12 
13     private TextRecord(String text) {
14         mText = text;
15     }
16 
17     public String getText() {
18         return mText;
19     }
20 
21     /**
22      * 解析 ndefRecord 文本數據
23      * @param ndefRecord
24      * @return
25      */
26     public static TextRecord parse(NdefRecord ndefRecord) {
27         // verify tnf   得到TNF的值
28         if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
29             return null;
30         }
31         // 得到字節數組進行判斷
32         if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
33             return null;
34         }
35 
36         try {
37             // 獲得一個字節流
38             byte[] payload = ndefRecord.getPayload();
39             // payload[0]取第一個字節。 0x80:十六進制(最高位是1剩下全是0)
40             String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8"
41                     : "UTF-16";
42             // 獲得語言編碼長度
43             int languageCodeLength = payload[0] & 0x3f;
44             // 獲得語言編碼
45             String languageCode = new String(payload, 1, languageCodeLength,
46                     "US-ASCII");
47             //
48             String text = new String(payload, languageCodeLength + 1,
49                     payload.length - languageCodeLength - 1, textEncoding);
50 
51             return new TextRecord(text);
52 
53         } catch (Exception e) {
54             throw new IllegalArgumentException();
55         }
56     }
57 
58 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM