NFC(9)NDEF文本格式规范及读写示例(解析与封装ndef 文本)

  

  只有遵守NDEF文本格式规范的数据才能写到nfc标签上.

NDEF文本格式规范

  不管什么格式的数据本质上都是由一些字节组成的。对于NDEF文本格式来说。

  1,这些数据的第1个字节描述了数据的状态,

  2,然后若干个字节描述文本的语言编码,

  3,最后剩余字节表示文本数据。

NFC(9)NDEF文本格式规范及读写示例(解析与封装ndef 文本)

其中第1个字节是 状态字节编码格式

NFC(9)NDEF文本格式规范及读写示例(解析与封装ndef 文本)

  这些数据格式由NFC Forum的相关规范定义,可以从下面的地址下载相关的规范。

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

重要

获取NFC标签中的数据要通过NdefRecord.getPayload方法完成。

在处理这些数据之前,最好判断一下NdefRecord对象中存储的是不是NDEF文本格式数据。
  判断的标准有如下两个

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

    可变的长度类型必须是NdefRecord.RTD_TEXT

解析示例

 public class TextRecord {
private final String mText; private TextRecord(String text) {
mText = text;
} public String getText() {
return mText;
} public static TextRecord parse(NdefRecord ndefRecord) {
/*
* 1,判断数据是否为NDEF格式
*/
// verify tnf
//第一个判断,TNF(类型名格式,Type Name Format)必须是NdefRecord.TNF_WELL_KNOWN
if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
return null;
}
//第二个判断,可变的长度类型必须是NdefRecord.RTD_TEXT。
if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
return null;
} try {
/*
* 2,取得读到的ndef字节流,
* 第1个字节描述了数据的状态,然后若干个字节描述文本的语言编码,最后剩余字节表示文本数据
*/
byte[] payload = ndefRecord.getPayload(); /*
* 3,解析第1个字节最高位,第7位:本流的字符编码值, 若值是0是UTF8,1是UTF16
* 注意 字符编码与语言编码不同.
*/
String textEncoding = ((payload[] & 0x80) == ) ? "UTF-8" : "UTF-16";
//第1个字节第6位总为0
/*
* 4,解析第1个字节0-5位,它存放语言编码的长度值
* 注意 字符编码与语言编码不同.
*/
int languageCodeLength = payload[] & 0x3f; /*
* 5,解析语言编码
*/
String languageCode = new String(payload, , languageCodeLength,"US-ASCII"); /*
* 6,解析出文本内容
*/
String text = new String(payload, languageCodeLength + ,
payload.length - languageCodeLength - , textEncoding); /*
* 7,返回解析结果
*/
return new TextRecord(text); } catch (Exception e) {
throw new IllegalArgumentException();
}
}
}

封装示例

 /*
* 重要函数
* 将txt数据按ndef格式封装一个record
* 第1个字节描述了数据的状态,然后若干个字节描述文本的语言编码,最后剩余字节表示文本数据
*/
public NdefRecord createTextRecord(String text) {
/*
* 按ndef格式封装1,准备语言编码,注意不是字符编码
*/
byte[] langBytes = Locale.CHINA.getLanguage().getBytes(
Charset.forName("US-ASCII"));
/*
* 按ndef格式封装2,设置text的字符编码为utf8
*/
Charset utfEncoding = Charset.forName("UTF-8");
byte[] textBytes = text.getBytes(utfEncoding);
int utfBit = ;
/*
* 按ndef格式封装3,第1个字节描述了数据的状态
*/
char status = (char) (utfBit + langBytes.length); /*
* 按ndef格式封装3,分配数据空间,
* 状态字节长度为1+语言编码长度+字符长度
*/
byte[] data = new byte[ + langBytes.length + textBytes.length];
/*
* 按ndef格式封装4,将各部分数据拷贝到数据中
*/
data[] = (byte) status;
System.arraycopy(langBytes, , data, , langBytes.length);
System.arraycopy(textBytes, , data, + langBytes.length,textBytes.length); /*
* 按ndef格式封装5,用数据构造NdefRecord
*/
NdefRecord ndefRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_TEXT, new byte[], data);
return ndefRecord;
}
上一篇:Configuring Apache Kafka for Performance and Resource Management


下一篇:二十一、Java基础--------IO流之综合案例分析