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 ...
随机推荐
- mysql 主从同步 Last_SQL_Error
参考文章: http://kerry.blog.51cto.com/172631/277414/ http://hancang2010.blog.163.com/blog/static/1824602 ...
- CSS3单位
em 做前端的应该对em不陌生,不是什么罕见的单位,是相对单位,参考物是父元素的font-size,具有继承的特点.如果字体大小是16px(浏览器的默认值),那么 1em = 16px. 不过,这样使 ...
- php获取数组中重复数据的两种方法
分享下php获取数组中重复数据的两种方法. 1,利用php提供的函数,array_unique和array_diff_assoc来实现 <?php function FetchRepeatMem ...
- 关于B/S系统在移动端应用的一些注意的地方(不断更新)
1.不要直接把PC端的页面直接搬到移动端来用.这里举个例子:有个活动页面,在PC端和手机端的Safari里展现都好,但是当用手机APP(如手机淘宝)扫码打开后,却没法顺畅的异步获取到jsonp的信息. ...
- 使用JS来实现验证码功能
最近想为自己的Django博客添加验证码功能,本来想使用第三方库来实现的,不过考虑到添加第三方库对性能的影响,以及第三方库是否安全可靠的问题,还是用自己的代码来实现吧.反正用JS来实现验证码功能又不是 ...
- 针对PIL中ImageDraw.py报错的解决方案
linux mint 13开始就发现这个问题了,一直不知道怎么解决,今天突然发现了解决方案,来分享给大家 下面是修改对比,自己根据修改,这个是系统文件,需要root权限,路径/usr/lib/pyth ...
- PHP+MYSQL 出现乱码的解决方法
PHP+MYSQL 出现乱码的解决方法 使用PHP+MYSQL时遇到过字符乱问题,解决方法: 在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的数据库消除乱码,对于 ...
- TabControl控件
private void Form1_Load(object sender, EventArgs e) { #region 显示样式 tabControl1.ImageList = imageList ...
- easy ui 异步上传文件,跨域
easy ui 跨域上传文件,代码如下: 1.html代码:(这段代码是个win窗体,我在点击上传图片按钮然后弹出一个上传图片的窗体,选择图片再进行上传,这样在form提交时,提交的参数会少一点.) ...
- 从JAVA多线程理解到集群分布式和网络设计的浅析
对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些 ...