android钱包nfc功能,Android NFC(二)M1卡电子钱包功能
M1任意可写块都可实现电子钱包的功能。本质其实就是按照一定的数据格式来对块值进行初始化、加值、减值。电子钱包的数据结构下图示例:
钱包结构.png
比如要将第5扇区的第0块作为电子钱包的存储位置,就要先将该块的数据格式化为上述形式。
钱包正值的意思是将10进制余额转为16进制数然后按字节逆序排列
钱包反值的意思是将钱包正值取反
地址的意思是当前的块值序号,如20块填14(10进制的20转为16进制的14)
如电子钱包余额为0,该块值数据为:00000000ffffffff0000000014eb14eb
当电子钱包余额为1时,该块值数据为:01000000feffffff0100000018e718e7
当电子钱包余额为100时,该块值数据为:640000009bffffff6400000018e718e7
余额的加值减值都要转换为10进制数然后进行计算之后再重新组装为16进制数据
电子钱包块值初始化:
/**
* 初始化块值
*
* @param blockIndex
* @param data
* @return
*/
public static byte[] m1FormatBlock(int blockIndex, int data) {
//region 系统的方法
//construct value block of value zero; "address" byte is set to 0 in this example
//byte[] zeroValue = {0, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 0, 255, 0, 255 };
//mifare.writeBlock(blockIndex, zeroValue);
//end region
byte[] result = new byte[16];
//钱包正值
byte[] temps = new byte[4];
//钱包反值
byte[] noTemps = new byte[4];
//4个字节的钱包值 反序排列 如1000 转为16进制00 00 03 e8 反序为 e8 03 00 00
for (int i = 0; i < 4; i++) {
int temp = data >> 8 * i;
temps[i] = (byte) (temp & 0xFF);
int noTemp = (~data) >> 8 * i;
noTemps[i] = (byte) (noTemp & 0xFF);
}
//钱包1-4字节 正值
//钱包5-8字节 反值
//钱包9-12字节 正值
for (int i = 0; i < 12; i++) {
if (i<4){
result[i] = temps[i%4];
} else if (i < 8){
result[i] = noTemps[i%4];
} else if (i < 12){
result[i] = temps[i%4];
}
}
/**
* 钱包地址
* 12字节 16进制正值
* 13字节 16进制反值
* 14字节 16进制正值
* 15字节 16进制反值
*/
result[12] = (byte) (blockIndex & 0xFF);
result[13] = (byte) ~(blockIndex & 0xFF);
result[14] = (byte) (blockIndex & 0xFF);
result[15] = (byte) ~(blockIndex & 0xFF);
return result;
}
电子钱包余额加(将余额转换为十进制数进行加操作计算出结果,然后再将结果转换为16进制倒序写入到卡中):
/**
* 加值
*/
private void m1incvalue(int block,int value) {
// increase the value block by some amount
mifare.increment(blockIndex, value);
// result is stored in scratch register inside tag; now write result to block
mifare.transfer(blockIndex);
}
电子钱包余额减(将余额转换为十进制数进行减操作计算出结果,然后再将结果转换为16进制倒序写入到卡中):
/**
* 减值
*/
private void m1decvalue(int block,int value) {
// decrease the value block by some amount
mifare.decrement(blockIndex, value);
// result is stored in scratch register inside tag; now write result to block
mifare.transfer(blockIndex);
}
根据块值获取余额(取前4字节数据):
/**
* 根据值块获取值数据
*
* @param block
* @return
*/
public static int resolveBlockValue(final byte[] block) {
byte[] blockValue = new byte[4];
if (block != null && block.length == 16) {
//获取前四位值
System.arraycopy(block, 0, blockValue, 0, blockValue.length);
//反转数组
byte[] temp = new byte[4];
for (int i = 0; i < temp.length; i++) {
temp[temp.length - 1 - i] = block[i];
}
String hex = bytesToHexString(temp);
return hex2Int(hex);
}
return -100;
}
/**
* 十六进制转int
*
* @param hex
* @return
*/
public static int hex2Int(String hex) {
byte[] bytes = hex2Bytes(hex);
int len = bytes.length;
int rec = 0;
for (int i = 0; i < len; i++) {
int temp = bytes[i] & 0xff;
int off = (len - 1 - i) * 8;
rec |= (temp << off);
}
return rec;
}
/**
* 十六进制转Byte
*
* @param hexStr
* @return
*/
public static byte[] hex2Bytes(String hexStr) {
int len = hexStr.length();
if (len % 2 != 0) {
throw new RuntimeException("length error");
}
byte[] b = new byte[hexStr.length() / 2];
int bLen = b.length;
int j = 0;
for (int i = 0; i < bLen; i++) {
char c0 = hexStr.charAt(j++);
char c1 = hexStr.charAt(j++);
b[i] = (byte) ((parse(c0) << 4) | parse(c1));
}
return b;
}
private static int parse(char c) {
if (c >= 'a')
return (c - 'a' + 10) & 0x0f;
if (c >= 'A')
return (c - 'A' + 10) & 0x0f;
return (c - '0') & 0x0f;
}
android钱包nfc功能,Android NFC(二)M1卡电子钱包功能相关推荐
- java做的web系统 m1 读卡器 结合_IE浏览器接入IC卡读写器实现M1卡的读写功能
基于ActiveX技术的ocx控件是实现网页上读写 IC卡的一个比较不错的方法,因为ocx是com组件,通过其发布的接口,IE可以实现所有的功能.ActiveX不仅能适应大部分编程语言,做到与编程语言 ...
- 中国金融集成电路(IC)卡电子钱包存折卡片规范
CLA,INS,P1,P2含义 CLA----指令类型:除'FF'外可赋任何值. INS----指令类型的指令码.只有在低半字节为0,且高半字节既不是'6'也不是'9'时,INS才有效. P1 P2- ...
- CPU卡电子钱包圈存消费调试记录
参考规范: <复旦FMCOS ><PBOC2.0第2部分> 1.密钥装载 圈存密钥装载: 80D40102153FF0F2000200112233445566778899aab ...
- launcher功能入口(二)
前言 本篇文章补充一下之前https://blog.csdn.net/a396604593/article/details/123487805文章中的一些没填上的坑. 此代码基于Android 12 ...
- 全面认识电子现金、电子钱包、qPBOC、闪付、UPCash
最近,小编所在的一个金融大咖群里出现了一场关于电子钱包.电子现金.非接小额.脱机交易等等方面的讨论,小编入行不久关于技术知识了解甚微,看着这些专业名词.英文缩写有点像丈二的和尚.为了能大致弄懂这些大咖 ...
- PBOC/EMV之小额支付, 电子钱包和借贷记
EMV标准共分四册, 分别是book1到book4, 这四册里没有对小额支付和EP/ED的相关说明, 也就是说,PBOC L2的这两个标准在EMV L2里是没有的. 所以,PBOC L2里借贷记部分实 ...
- 使用NFC模拟校园卡门禁功能 【Mac, Windows, Android, 手环】
COVID-19期间,我们学校实行通行证制度,只有具有通行证的同学的卡才可以自由进出校园,他而没有通行证的人下人出校只能是一种奢望.在这种无理取闹的制度之下,我试想通过NFC模拟出那些可以自由进出的同 ...
- c语言读写nfc,Android NFC M1卡读写芯片卡读写(CPU卡读写)(RFID读写)
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/sgn5200/article/deta ...
- 支持nfc的android手机,哪些手机有nfc功能
现在有很多的手机都是拥有nfc功能的,但是有很多人并不了解什么是nfc功能,nfc功能有什么用呢?Nfc功能是一种而已进行近距离的无线通信的功能,支持使用NFC功能的手机和被是可以进行交换数据的.拥有 ...
最新文章
- oracle standby同步,ORACLE 利用rman增量备份同步standby库
- java tcp 编程实例_Java实现基于TCP的通讯程序实例解析
- linux oracle脚本编写,Linux 脚本编写基础(一)--语法
- Spring Boot笔记-mysql5.7使用@Table后提示doesn't exist问题
- 迷宫问题c语言报告,c语言写的迷宫问题
- apollo动态切换mysql数据源_log4j2从Apollo初始化配置并可动态变更
- μC/OS-III---I笔记3---时间管理
- 2022年2月Python小屋编程比赛获奖名单
- 基于XMPP协议的Android即时通信系
- C语言中二级指针的作用
- 考计算机科学考研老师问,名师答疑:计算机专业考研复习6问!
- 矩阵理论 期末判断题汇总
- 工程数学(线性代数)笔记
- 如何检测浏览器是否安装了Adblock,uBlock Origin,Adguard,uBlock等广告屏蔽插件
- 传奇服务器如何修改地图和刷怪,传奇如何将怪物刷在指定地图?
- 个人计算机硬件配置清单,个人台式电脑配置清单
- 惠普HP Deskjet D2660 打印机驱动
- 国家互联网信息办公室修订《互联网跟帖评论服务管理规定》发布施行
- 不懂英语学计算机编程,不懂英语应该怎么学编程
- 评价模型中熵值法Excel和Python实现
热门文章
- python可以计算复杂积分吗_python – Scipy:加快2D复数积分的计算
- 2017.8.11 OSU 失败总结
- 2017.4.23loli测试
- 2017.4.20 火星人 思考记录
- 【英语学习】【WOTD】darling 释义/词源/示例
- Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(13/E) - FXSAVE/FXRSTOR指令
- qt 怎么设计个性化的滑块_滑块上走滑块模具结构设计,不一样的结构思维成就你的高薪职业...
- 金属,塑料,傻傻分不清楚
- Unity3D开发技巧:如何避开unity编辑器的那些坑
- 如和用Python获取今日头条上面三千美女图,且看教程