NFC(9)NDEF文本格式规范及读写示例(解析与封装ndef 文本)
只有遵守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 文本)的更多相关文章
- NFC(10)NDEF uri格式规范及读写示例(解析与封装ndef uri)
只有遵守NDEF uri 格式规范的数据才能写到nfc标签上. NDEF uri 格式规范 uri 只有两部分: 第1个字节是uri协议映射值,如:0x01 表示uri以 http://www.开头. ...
- NFC(11)MifareUltralight格式规范及读写示例
注意 MifareUltralight 不支三种过滤方式之一,只支持第四种(用代码,activity singleTop ) 见 NFC(4)响应NFC设备时启动activity的四重过滤机制 Mi ...
- 9、NFC技术:NDEF文本格式解析
NDEF文本格式规范 不管什么格式的数据本质上都是由一些字节组成的.对于NDEF文本格式来说.这些数据的第1个字节描述了数据的状态,然后若干个字节描述文本的语言编码,最后剩余字节表示文本数据. ...
- 11、NFC技术:NDEF Uri格式解析
NDEF Uri格式规范 与NDEF文本格式一样,存储在NFC标签中的Uri也有一定的格式 http://www.nfc-forum.org/specs/spec_dashboard 编写可以解析Ur ...
- 理解CSV格式规范(解析CSV必备)
什么是CSV逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录.每个记录由一个或多个字段组成,用逗号分隔.使 ...
- OverWatch团队文档格式规范
V1.0 最终修改于2016/10/19 概述 软件工程中,一份优雅的文档不仅能降低团队成员之间的沟通难度,而且能给之后的开发者提供一个非常有效的引导.本团队为了规范整个项目中文档的格式,便于统一管理 ...
- GeoJSON格式规范说明
GeoJSON格式规范说明 1.简介 GeoJSON是一种对各种地理数据结构进行编码的格式.GeoJSON对象可以表示几何.特征或者特征集合.GeoJSON支持下面几何类型:点.线.面.多点.多线.多 ...
- HTML基础总结<文本格式>
HTML 文本格式化标签 标签 描述 <b> 定义粗体文本 <em> 呈现为被强调的文本 <i> 定义斜体字 <small> 定义小号字 <str ...
- 使用mysqldump以分隔文本格式转储数据
1.使用mysqldump以分隔文本格式转储数据 mysqldump --tab=/tmp/data --fields-terminated-by=, --fields-enclosed-by=&qu ...
随机推荐
- JAVA MemCache 史无前例的详细讲解【转】
非原创转自:http://nhy520.iteye.com/blog/1775893 这篇文章是我看到的介绍的比较详细的,入门级别算是足足够了 Memcach什么是Memcache Memcache集 ...
- WeX5是主要进行app开发吗?能开发微信App吗?
WeX5是一款html5开发工具,可以进行app开发,做出各种H5 App,同样也可以进行主要运行在PC的html5产品,. WeX5开发的应用,不仅可以在微信上运行,也可以直接手机浏览器运行,或者打 ...
- Hibernate Cascade & Inverse
Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在 ...
- 彻底删除sql server的方法
请先确定是否把sql相关的东西删了,建议进行如下操作. 1.先下个Windows Install Clean Up,清理sql相关东西,要全部清理. 2.到控制面板--添加删除程序中看是否还有未删的. ...
- Linux文件目录结构说明
- phpmailer 实现发送邮件
在注册的时候,常常会用到邮件验证,一直想弄明白这是怎么实现的,记得2年前曾经试过这个问题,没有实现,今天困到不行的时候开始决定搞明白这个,然后,然后就出来了. <?php require(&qu ...
- 怎样下载安装Firebug和使用Firebug
Firebug是基于火狐(FireFox)浏览器的一个插件,它的作用是给Web页面开发者一个很好的测试前端页面代码的工具.所以深受网页开发者或网页布局爱好者的喜爱.像我们用DIV+CSS和html所写 ...
- C++ STL中迭代器失效的问题
my_container.erase(iter); 其中my_container是STL的某种容器,iter是指向这个容器中某个元素的迭代器.如果不是在for,while循环中,这种方式删除元素没有问 ...
- Oracle的Import用法
1. imp 命令介绍 imp 命令可以通过输入各种参数来控制导出方式: imp keyword=value 或 keyword=(value1,value2,...,valueN) ,例如 i ...
- SQL学习中(一)序列
序列可以理解数值序列生成器,通俗的说是按照已经设定的规则自动产生数据的方案对象.--SQL SERVER不支持 个人认为序列类似于SQLSERVER中的identity(1,1),可以用于在表中添加数 ...