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 ...
随机推荐
- 通用SQL存储过程分页以及asp.net后台调用
创建表格并添加300万数据 use Stored CREATE TABLE UserInfo( --创建表 id ,) PRIMARY KEY not null,--添加主键和标识列 UserName ...
- Spark Streaming揭秘 Day17 资源动态分配
Spark Streaming揭秘 Day17 资源动态分配 今天,让我们研究一下一个在Spark中非常重要的特性:资源动态分配. 为什么要动态分配?于Spark不断运行,对资源也有不小的消耗,在默认 ...
- Oracle的rownum原理
Oracle中,按特定条件查询前N条记录,用个rownum就搞定了: SQL> select * from dept where rownum<3; 而对rownum用"> ...
- 三、记一次失败的 CAS 搭建 之 服务端配置
==================================================================================================== ...
- sql表连接left join,right join,inner join三者之间的区别
sql表连接left join,right join,inner join区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 (以左表数据为基准,不足补为NULL) ...
- Telerik RadGridView 右键菜单如何设置?
问题: 我想去掉红线框住的部分,希望有会的网友帮助我,谢谢! 解决方法: 默认: 修改: [利用 ContextMenuOpening 事件,对应你的项目,你要自己修改那判断的字符串(你的中文)] p ...
- 首页banner焦点图自动轮播效果
今天来介绍一下我前两天写一个小任务的时候遇到的一些问题,如果能够有所帮助或者启发,那将是我的荣幸. <div class="banner"> <a class=& ...
- springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题
解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640 ...
- svn is already locked解决方案
在出错文件夹下,鼠标右键TortoiseSVN->Clean up. SVN错误:Attempted to lock an already-locked dir 1.出现这个问题后使用“清理”功 ...
- css3分栏
<!DOCTYPE HTML> <meta charset="UTF-8"> <title>分栏</title> <style ...