【C】EM卡韦根32/24格式卡号转换的实现
写在前面
第八周实验报告的deadline马上就要到了,大家都在奋笔疾书。这次的实验报告中有一个十分秃然的任务,要求学生用C语言编写一段代码,来处理编码问题。
我的ddl是在第七周,所以较早地解决了这个问题。但解决过程也是十分的秃然。鉴此,我决定分享一下这个任务的解决经验,希望给予需要的同学一点微薄的帮助。
索引
- 写在前面
- EM卡韦根32/24格式卡号转换的实现
- 1.1 问题概述
- 1.2 EM卡的ID格式
- 1.3 规划卡号转换思路
- 1.4 代码实现
- 写在最后
注:本篇文章中的所有图片均添加了title属性,可将鼠标放置在图片上查看悬浮信息。
EM卡韦根32/24格式卡号转换的实现
1.1 问题概述
这个问题大概长这个样子:
使用C语言程序语句来描述,EM4110卡面上三个数据间转换。额外引入一个操作数,通过C语言运算操作符实现。
看完问题,我们大概了解到,要想解决问题,首先要弄清EM卡上的数据是什么样子的。
1.2 EM卡的ID格式
这是一张EM4110卡:
EM卡是一种ID卡,其内部储存了卡内序列号(十六进制)。我们已知这张卡的卡内序列号为 19 00 6D 30 F4 .
我们观察到,卡面上喷印了一段序列号:0007155956 109, 12532 。卡面序列号和卡内序列号又有什么关系呢?通过计算,我们可以得出下述关系:
- 卡内序列号
以序列 19 00 6D 30 F4 为例,19 为厂商代码,00 为固定位,6D 30 F4 可以根据韦根32/24格式转换成卡面序列号。 - 前段序列
前段序列是韦根32格式卡号,它是将十六进制的卡内序列号 19 00 6D 30 F4 中的后8位 00 6D 30 F4 ,经数制转换后得到10位十进制数据(不足10位在首位补0). - 后段序列
后段ID是韦根24格式卡号,它是将十六进制的卡内序列号中的后6位,按照“2+4”的格式分成两段十进制数据,两段数据间用“,”隔开。
例如:卡内序列号后6位为 6D 30 F4 ,则对应的后段卡号为 6D, 30 F4,即 109, 12532.
了解了韦根32/24格式卡号的原理后,我们开始解决卡号转换的问题。
1.3 规划卡号转换思路
按照 1.2 EM卡的ID格式 中的内容,我们可以画出流程图:
Begin("begin") --> Input["input Operand"] --> Switch{"Operand?"}
Switch --> |"Operand = 0"| W32To24_Input["input Wiegand32"]
W32To24_Input --> W32To24_Handle1["Wiegand24_1 = Wiegand32 >> 16"]
W32To24_Handle1 --> W32To24_Handle2["Wiegand24_2 = (Wiegand32 << 16) >> 16"]
W32To24_Handle2 --> Output
Switch -->|"Operand = 1"| W24To32_Input["input Wiegand24"]
W24To32_Input --> W24To32_Handle1["Wiegand32 = Wiegand24_1 << 16 | Wiegand 24_2"]
W24To32_Handle1 --> W24To32_Handle2["Wiegand24_1 >> 16"]
W24To32_Handle2 --> Output
Switch -->|"Operand = -1"| End
Output["output Wiegand32 Wiegand24_1, Wiegand24_2"] --> End("end")
考虑到进制转换问题,这里使用位运算可以简化我们对数的操作。
下面对位运算语句进行解释:
- Wiegand24_1 = Wiegand32 >> 16
如图,将 Wiegand32 右移16位,得到 Wiegand24_1 后段序列第一部分。
- Wiegand24_2 = (Wiegand32 << 16) >> 16
如图,先将 Wiegand32 左移16位,消掉 30 ,得到的结果再右移16为,即为 Wiegand24_2 后段序列第二部分。
- Wiegand32 = Wiegand24_1 << 16 | Wiegand 24_2
如图,将左移16位的 Wiegand24_1 与 Wiegand 24_2 进行或运算,得到 Wiegand32 前段序列。
- Wiegand24_1 >> 16
如上图,对 Wiegand24_1 左移16位后,应将其移回初始比特位,以便输出结果。
1.4 代码实现
看到这里,相信大家也能够独立实现代码的编写了。下面我提供一种实现方法:
#include<stdio.h>
int main()
{
int operand;
int w32, w24_1, w24_2;
printf("----------------------------------\n\n");
printf(" 0\tWeiGE 32 -> WeiGE 32/24\n");
printf(" 1\tWeiGE 24 -> WeiGE 32/24\n");
printf(" -1\tExit\n");
printf("\n----------------------------------\n");
while (operand != -1)
{
printf(">> Please enter command: ");
scanf("%d", &operand);
if (operand == 0)
{
printf(">> Please enter WeiGE 32: ");
scanf("%d", &w32);
w24_1 = w32 >> 16;
w24_2 = (w32 << 16) >> 16;
printf(">> WeiGE 32/24: ");
printf("%010d %d,%d\n", w32, w24_1, w24_2);
}
else if (operand == 1)
{
printf(">> Please enter WeiGE 24: ");
scanf("%d,%d", &w24_1, &w24_2);
w32 = w24_1 << 16 | w24_2;
w24_1 >> 16;
printf(">> WeiGE 32/24: ");
printf("%010d %d,%d\n", w32, w24_1, w24_2);
}
}
return 0;
}
这段代码根据要求额外添加了操作数系统,可根据提示信息来选择操作模式,大家也可以上手体验一下。
写在最后
源心锁学长在去年也写了一篇关于EM卡号转换的文章,本文末代码的思路也和学长的思路大致相同,在此膜拜一下大佬。
终于赶在五一放假前敲完了这篇文章,实验人去肝报告了,没有时间排版......
最后祝大家假期快乐~
【C】EM卡韦根32/24格式卡号转换的实现的更多相关文章
- 手机三种SIM卡 你所不知道的剪卡“秘密”
SIM卡物理尺寸的发展是逐渐轻薄化,尺寸逐渐缩小的一个过程,最早手机中的卡都是2FF,2003年国际标准提出3FF,当前很多终端都使用这种形态的卡,4FF在2011年的国际标准会议中提出,2012年纳 ...
- 图文:TF卡和SD卡的区别及什么是TF卡?什么是SD卡
小型存储设备凭借低廉的价格.多样化的品种.实用等特性大量充斥在大家身边,比如智能手机手机上.数码照相机上.游戏机上(一般是掌机)等都小型电子设备都频繁的使用到这种统称为SD的产品,比如TF卡和SD卡( ...
- 德卡Z90读卡器读取社保卡,德卡Z90读卡器CSharp示例程序源码
前言,最近学习调用 医保卡业务,使用德卡读卡器,主要就是调用一个DLL,动态库文件. 借着自学的机会把心得体会都记录下来,方便感兴趣的小伙伴学习与讨论. 内容均系原创,欢迎大家转载分享,但转载的同时别 ...
- Python:将utf-8格式的文件转换成gbk格式的文件
需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.ope ...
- oracle 报“无效数字”异常和“ORA-01830: 日期格式图片在转换整个输入字符串之前结束”
1.问题1 执行下列SQL: sql = "select count(1) as totle from vhl_model_data a where a.OBTAIN_CREATE_TIME ...
- BeanUtils 日期转换(本地格式yyyy-MM-dd)转换成date
1.BeanUtils工具的使用 1)beanUtils 可以便于对javaBean的属性进行赋值. 2)beanUtils 可以便于对javaBean的对象进行赋值. 3)beanUtils可以将一 ...
- jpg、png格式的图片转换成webp后颜色失真的问题
今天简单的试用了一下 cweb.exe 将 jpg, png 格式的图片转换成 webp 格式. 我今天下载的是当前最新版:1.0.0 cwebp 3.jpg -q 85 -o 3.webp 发现图 ...
- 如何将字符串格式的对象转换成真正的js对象?
1.如何将字符串格式的对象转换成真正的js对象? <script>//eval 的作用eval('var a = 100');console.log(a);</script> ...
- javascript:针对yyyy-MM-dd hh:mm:ss格式的毫秒转换.
javascript:针对yyyy-MM-dd hh:mm:ss格式的毫秒转换. 时间 2015-11-07 22:18:39 HideHai's blog 原文 http://www.hideh ...
随机推荐
- token、cookie和session区别以及django中的cookie,csrf
参考:https://my.oschina.net/xianggao/blog/395675?fromerr=GC9KVenE [前言]登录时需要post的表单信息. 先跳过具体案例,讲解基础知识: ...
- HDFS 03 - 你能说说 HDFS 的写入和读取过程吗?
目录 1 - HDFS 文件的写入 1.1 写入过程 1.2 写入异常时的处理 1.3 写入的一致性 2 - HDFS 文件的读取 2.1 读取过程 2.2 读取异常时的处理 版权声明 1 - HDF ...
- 后端程序员之路 28、一个轻量级HTTP Server的实现
提到http server,一般用到的都是Apache和nginx这样的成熟软件,但是,有的情况下,我们也许也会用一些非常轻量级的http server.http server的c++轻量级实现里,M ...
- (三)String、StringBuilder、StringBuffer在字符串操作中的性能差异浅析
参考资料:https://www.iteye.com/blog/hank4ever-581463 <Core Java Volume I-Fundamentals>原书第十版 <Ja ...
- PAT-1152(Google Recruitment)字符串+素数
Google Recruitment PAT-1152 本题最需要注意的是最后输出要以字符串形式输出,否则可能会出现前导0的情况. /** * @Author WaleGarrett * @Date ...
- springboot源码解析-管中窥豹系列之EnableXXX(十)
一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...
- [UNP] IO 复用
UNP Part-2: Chapter 6. I/O Multiplexing: The select and poll Functions 的读书笔记. 在 这篇博客 的最后,我们对文章中的服务器- ...
- Java数据持久层
一.前言 1.持久层 Java数据持久层,其本身是为了实现与数据源进行数据交互的存在,其目的是通过分层架构风格,进行应用&数据的解耦. 我从整体角度,依次阐述JDBC.Mybatis.Myba ...
- 迷宫问题(DFS)
声明:图片及内容基于https://www.bilibili.com/video/BV1oE41177wk?t=3245 问题及分析 8*8的迷宫,最外周是墙,0表示可以走,1表示不可以走 设置迷宫 ...
- C# 应用 - 使用 HttpWebRequest 发起 Http 请求
helper 类封装 调用 1. 引用的库类 \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll Syste ...