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

NDEF文本格式规范

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

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

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

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

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

  这些数据格式由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;
}

NFC(9)NDEF文本格式规范及读写示例(解析与封装ndef 文本)的更多相关文章

  1. NFC(10)NDEF uri格式规范及读写示例(解析与封装ndef uri)

    只有遵守NDEF uri 格式规范的数据才能写到nfc标签上. NDEF uri 格式规范 uri 只有两部分: 第1个字节是uri协议映射值,如:0x01 表示uri以 http://www.开头. ...

  2. NFC(11)MifareUltralight格式规范及读写示例

    注意 MifareUltralight 不支三种过滤方式之一,只支持第四种(用代码,activity singleTop ) 见  NFC(4)响应NFC设备时启动activity的四重过滤机制 Mi ...

  3. 9、NFC技术:NDEF文本格式解析

    NDEF文本格式规范     不管什么格式的数据本质上都是由一些字节组成的.对于NDEF文本格式来说.这些数据的第1个字节描述了数据的状态,然后若干个字节描述文本的语言编码,最后剩余字节表示文本数据. ...

  4. 11、NFC技术:NDEF Uri格式解析

    NDEF Uri格式规范 与NDEF文本格式一样,存储在NFC标签中的Uri也有一定的格式 http://www.nfc-forum.org/specs/spec_dashboard 编写可以解析Ur ...

  5. 理解CSV格式规范(解析CSV必备)

    什么是CSV逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录.每个记录由一个或多个字段组成,用逗号分隔.使 ...

  6. OverWatch团队文档格式规范

    V1.0 最终修改于2016/10/19 概述 软件工程中,一份优雅的文档不仅能降低团队成员之间的沟通难度,而且能给之后的开发者提供一个非常有效的引导.本团队为了规范整个项目中文档的格式,便于统一管理 ...

  7. GeoJSON格式规范说明

    GeoJSON格式规范说明 1.简介 GeoJSON是一种对各种地理数据结构进行编码的格式.GeoJSON对象可以表示几何.特征或者特征集合.GeoJSON支持下面几何类型:点.线.面.多点.多线.多 ...

  8. HTML基础总结<文本格式>

    HTML 文本格式化标签 标签 描述 <b> 定义粗体文本 <em> 呈现为被强调的文本 <i> 定义斜体字 <small> 定义小号字 <str ...

  9. 使用mysqldump以分隔文本格式转储数据

    1.使用mysqldump以分隔文本格式转储数据 mysqldump --tab=/tmp/data --fields-terminated-by=, --fields-enclosed-by=&qu ...

随机推荐

  1. js 中的正则表达式

    一:正则表达式 定义:记录文本规则的代码 作用:表单验证,爬虫技术,可以对目标的内容进行替换. 二:正则表达式的组成 1:普通字符组成正则 浏览器的输出 2:定义字符集组成正则 3:特殊字符集组成正则 ...

  2. Ubuntu 16.04配置OpenCV 3.1.0 for Java

    我们都知道,OpenCV是基于C++的开源计算机视觉库,但是从2.4.4版本开始提供了Java绑定,也就是说,我们也可以使用Java来开发基于OpenCV的计算机视觉应用.目前,最新的版本是3.1.0 ...

  3. AVA取整以及四舍五入

    AVA取整以及四舍五入 import java.math.BigDecimal; public class Test { public static void main(String[] args) ...

  4. 判断IE版本的语句 [if lte IE 6]...[endif]

    <!–[if lte IE 6]>……<![endif]–>Ite:less than or equal to意思是小于或等于IE6浏览器,用于IE浏览器的条件注释,常用于CS ...

  5. 转 在无法通过yum下载非标准包时,怎么办

    在CentOS下,我们可以通过yum来下载或更新rpm包,但是标准的源(repository)里只提供一部分的rpm包,虽然大部分情况下,这些包是够用的.但是有时候还是需要下载其他的一些非标准的包,如 ...

  6. NULL, NUL, EOF, '\0',0区别

    NULL: 定义为0或0L或(void *)0,用于指示一个指针值是空,即什么都不指:'\0': 用且只用字符串结束符;NUL : 0x00,0值字符,可以用于结束ASCII字符串,和'\0'类似,但 ...

  7. 地形图比例尺、等高距和DEM分辨率关系

    地表面的形态是很复杂的,不同地貌类型的形态是由它的相对高度、地面坡度以及所处的地势所决定的,它们是影响等高距的主要因素。从等高距计算公式可以看出,当地图比例尺和图上等高线间的最小距离简称等高线间距确定 ...

  8. 因程序问题引起的服务器CPU负荷一直保持在90%以上

    昨天早上刚到办公室,就接到客户的电话说其某台小型机的CPU负荷一直保持在90以上,告警短信发个不停,一直没有间断过.该服务器是一台IBM的小型机,性能应该还是不错的,出现这样的情况确实不太正常.登陆上 ...

  9. OO之观察者模式

    以下为观察者模式详解: 引子: 假设有这样一个问题,有一条河经过一个山谷,山谷下有一个村庄,人们在山谷处修建了一个水库,并安排专人管理,当水库的水位过高时要通知下游居民注意水库的开闸放水,当水库的水温 ...

  10. jquery pass parameter to ajax callback

    $('.del').on('click', function () { var id = $(this).attr('id'); var url = '/m/g2_content_del/' + id ...