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卡电子钱包功能相关推荐

  1. java做的web系统 m1 读卡器 结合_IE浏览器接入IC卡读写器实现M1卡的读写功能

    基于ActiveX技术的ocx控件是实现网页上读写 IC卡的一个比较不错的方法,因为ocx是com组件,通过其发布的接口,IE可以实现所有的功能.ActiveX不仅能适应大部分编程语言,做到与编程语言 ...

  2. 中国金融集成电路(IC)卡电子钱包存折卡片规范

    CLA,INS,P1,P2含义 CLA----指令类型:除'FF'外可赋任何值. INS----指令类型的指令码.只有在低半字节为0,且高半字节既不是'6'也不是'9'时,INS才有效. P1 P2- ...

  3. CPU卡电子钱包圈存消费调试记录

    参考规范: <复旦FMCOS ><PBOC2.0第2部分> 1.密钥装载 圈存密钥装载: 80D40102153FF0F2000200112233445566778899aab ...

  4. launcher功能入口(二)

    前言 本篇文章补充一下之前https://blog.csdn.net/a396604593/article/details/123487805文章中的一些没填上的坑. 此代码基于Android 12 ...

  5. 全面认识电子现金、电子钱包、qPBOC、闪付、UPCash

    最近,小编所在的一个金融大咖群里出现了一场关于电子钱包.电子现金.非接小额.脱机交易等等方面的讨论,小编入行不久关于技术知识了解甚微,看着这些专业名词.英文缩写有点像丈二的和尚.为了能大致弄懂这些大咖 ...

  6. PBOC/EMV之小额支付, 电子钱包和借贷记

    EMV标准共分四册, 分别是book1到book4, 这四册里没有对小额支付和EP/ED的相关说明, 也就是说,PBOC L2的这两个标准在EMV L2里是没有的. 所以,PBOC L2里借贷记部分实 ...

  7. 使用NFC模拟校园卡门禁功能 【Mac, Windows, Android, 手环】

    COVID-19期间,我们学校实行通行证制度,只有具有通行证的同学的卡才可以自由进出校园,他而没有通行证的人下人出校只能是一种奢望.在这种无理取闹的制度之下,我试想通过NFC模拟出那些可以自由进出的同 ...

  8. c语言读写nfc,Android NFC M1卡读写芯片卡读写(CPU卡读写)(RFID读写)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/sgn5200/article/deta ...

  9. 支持nfc的android手机,哪些手机有nfc功能

    现在有很多的手机都是拥有nfc功能的,但是有很多人并不了解什么是nfc功能,nfc功能有什么用呢?Nfc功能是一种而已进行近距离的无线通信的功能,支持使用NFC功能的手机和被是可以进行交换数据的.拥有 ...

最新文章

  1. oracle standby同步,ORACLE 利用rman增量备份同步standby库
  2. java tcp 编程实例_Java实现基于TCP的通讯程序实例解析
  3. linux oracle脚本编写,Linux 脚本编写基础(一)--语法
  4. Spring Boot笔记-mysql5.7使用@Table后提示doesn't exist问题
  5. 迷宫问题c语言报告,c语言写的迷宫问题
  6. apollo动态切换mysql数据源_log4j2从Apollo初始化配置并可动态变更
  7. μC/OS-III---I笔记3---时间管理
  8. 2022年2月Python小屋编程比赛获奖名单
  9. 基于XMPP协议的Android即时通信系
  10. C语言中二级指针的作用
  11. 考计算机科学考研老师问,名师答疑:计算机专业考研复习6问!
  12. 矩阵理论 期末判断题汇总
  13. 工程数学(线性代数)笔记
  14. 如何检测浏览器是否安装了Adblock,uBlock Origin,Adguard,uBlock等广告屏蔽插件
  15. 传奇服务器如何修改地图和刷怪,传奇如何将怪物刷在指定地图?
  16. 个人计算机硬件配置清单,个人台式电脑配置清单
  17. 惠普HP Deskjet D2660 打印机驱动
  18. 国家互联网信息办公室修订《互联网跟帖评论服务管理规定》发布施行
  19. 不懂英语学计算机编程,不懂英语应该怎么学编程
  20. 评价模型中熵值法Excel和Python实现

热门文章

  1. python可以计算复杂积分吗_python – Scipy:加快2D复数积分的计算
  2. 2017.8.11 OSU 失败总结
  3. 2017.4.23loli测试
  4. 2017.4.20 火星人 思考记录
  5. 【英语学习】【WOTD】darling 释义/词源/示例
  6. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(13/E) - FXSAVE/FXRSTOR指令
  7. qt 怎么设计个性化的滑块_滑块上走滑块模具结构设计,不一样的结构思维成就你的高薪职业...
  8. 金属,塑料,傻傻分不清楚
  9. Unity3D开发技巧:如何避开unity编辑器的那些坑
  10. 如和用Python获取今日头条上面三千美女图,且看教程