写在前面

第八周实验报告的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格式 中的内容,我们可以画出流程图:

graph TD
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格式卡号转换的实现的更多相关文章

  1. 手机三种SIM卡 你所不知道的剪卡“秘密”

    SIM卡物理尺寸的发展是逐渐轻薄化,尺寸逐渐缩小的一个过程,最早手机中的卡都是2FF,2003年国际标准提出3FF,当前很多终端都使用这种形态的卡,4FF在2011年的国际标准会议中提出,2012年纳 ...

  2. 图文:TF卡和SD卡的区别及什么是TF卡?什么是SD卡

    小型存储设备凭借低廉的价格.多样化的品种.实用等特性大量充斥在大家身边,比如智能手机手机上.数码照相机上.游戏机上(一般是掌机)等都小型电子设备都频繁的使用到这种统称为SD的产品,比如TF卡和SD卡( ...

  3. 德卡Z90读卡器读取社保卡,德卡Z90读卡器CSharp示例程序源码

    前言,最近学习调用 医保卡业务,使用德卡读卡器,主要就是调用一个DLL,动态库文件. 借着自学的机会把心得体会都记录下来,方便感兴趣的小伙伴学习与讨论. 内容均系原创,欢迎大家转载分享,但转载的同时别 ...

  4. Python:将utf-8格式的文件转换成gbk格式的文件

    需求:将utf-8格式的文件转换成gbk格式的文件 实现代码如下: def ReadFile(filePath,encoding="utf-8"): with codecs.ope ...

  5. oracle 报“无效数字”异常和“ORA-01830: 日期格式图片在转换整个输入字符串之前结束”

    1.问题1 执行下列SQL: sql = "select count(1) as totle from vhl_model_data a where a.OBTAIN_CREATE_TIME ...

  6. BeanUtils 日期转换(本地格式yyyy-MM-dd)转换成date

    1.BeanUtils工具的使用 1)beanUtils 可以便于对javaBean的属性进行赋值. 2)beanUtils 可以便于对javaBean的对象进行赋值. 3)beanUtils可以将一 ...

  7. jpg、png格式的图片转换成webp后颜色失真的问题

    今天简单的试用了一下 cweb.exe 将 jpg, png 格式的图片转换成 webp 格式. 我今天下载的是当前最新版:1.0.0 cwebp 3.jpg  -q 85 -o 3.webp 发现图 ...

  8. 如何将字符串格式的对象转换成真正的js对象?

    1.如何将字符串格式的对象转换成真正的js对象? <script>//eval 的作用eval('var a = 100');console.log(a);</script> ...

  9. 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 ...

随机推荐

  1. DRF 三大认证的配置及使用方法

    目录 三大认证 一.身份认证 1.身份认证配置 1.1 全局配置身份认证模块 1.2 局部配置身份认证模块 2.drf提供的身份认证类(了解) 3.rf-jwt提供的身份认证类(常用) 4.自定义身份 ...

  2. Git 命令将电脑上的文件上传到 Github

    1.在电脑上安装 Windows 版 Git下载地址:https://git-scm.com/downloads2.使用 Git GUI 生成 SSH Key 3.将 SSH Key 添加到 Gith ...

  3. 优化程序性能(CSAPP)

    [前言]虽然现在没有接触过大型项目,但是工作了会注重性能.学习一下,应该能更好更快的理解别人写的经典优化的代码.结合CSAPP和自己的理解,总结一下. 一.程序优化综述 1.高效程序的特点 (1)适当 ...

  4. Python基础语法函数

    函数是什么 Python中的函数与数学中的函数不同,它不再只是公式,而是实实在在有着自己特定功能的代码.其实在潜移默化中我们已经有所接触了. 比如print()函数,range()函数,type()函 ...

  5. msfconsole 常用命令记录

    Metasploit是一款开源的渗透测试框架,它现在还在逐步发展中,下面介绍的一些功能和命令,可能会在未来失效. Metasploit框架提供了多种不同方式的使用接口: msfgui msfconso ...

  6. 在windows上安装MySQL数据库注意点及Navicat Premium 15的破解

    在windows上安装MySQL数据库  跟随慕课网教程(http://www.imooc.com/wiki/mysqllesson/mysqlwindows.html)下载安装MySQL: 其中注意 ...

  7. 完全使用 VSCode 开发的心得和体会

    前言 我刚开始是一名 Java 程序员,陪伴我最久的老伙计是 Java 世界里面出名好用的是 Jetbrains 家族的重量级产品 Intelli IDEA 编辑器,不过 IDEA 主要是用来写代码, ...

  8. Centos mini系统下的Hadoop集群搭建

    1.事前了解 1.1 Hadoop 百度百科:https://baike.baidu.com/item/Hadoop/3526507?fr=aladdin Hadoop是一个由Apache基金会所开发 ...

  9. Django常见问题集锦

    1. 解决pycharm终端/cmd运行python脚本报错"ImportError/ModuleNotFoundError:No Module named ..." 问题 项目结 ...

  10. 关于深度学习配置的一些tips

    建立博客的第一天,将以前记录的一些东西存档下,方便查看. 1安装anaconda 2pycharm破解 配置环境变量3虚拟环境推荐是python3.5或3.6版本 4.安装numpy tensorfl ...