写在前面

第八周实验报告的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. 一个基于 Vue3 的开源项目,3个月时间 star 终于破千!

    本文主要是对如何做开源项目的一些思考. 前文回顾: <Vue3 来了,Vue3 开源商城项目重构计划正式启动!> <一个基于 Vue 3 + Vant 3 的开源商城项目> 关 ...

  2. Prometheus时序数据库-磁盘中的存储结构

    Prometheus时序数据库-磁盘中的存储结构 前言 之前的文章里,笔者详细描述了监控数据在Prometheus内存中的结构.而其在磁盘中的存储结构,也是非常有意思的,关于这部分内容,将在本篇文章进 ...

  3. JS产生GUID

    //生成全球唯一字符串function guidGenerator() { var S4 = function () { return (((1 + Math.random()) * 0x10000) ...

  4. 定西+简单dp

    定西 ECNU-3531 #include<iostream> #include<cstdio> #include<algorithm> #include<c ...

  5. c# float类型和double类型相乘出现精度丢失

    c# float类型和double类型相乘出现精度丢失 double db = 4.0; double db2 = 1.3; float f = 1.3F; float f2 = 4.0F; Deci ...

  6. MySQL基础知识:启动管理和账号管理

    整理.记录常用的MySQL基础知识:时间久了,很多就忘记了. 操作系统环境为MacOS Catalina, MySQL版本为: 8.0.13 MySQL Community Server - GPL. ...

  7. POJ_1797 Heavy Transportation 【最大生成树的最小边】

    一.题目 POJ1797 二.分析 题意就是让你找到从1到n的一条路,由于边的最大称重限制,你需要确定限制的最小值,也就是能运输的最大值. 可以结合最小生成树想,利用并查集,然后不断更新答案即可,需要 ...

  8. golang实现已知三角形三点坐标,求三角形面积

    代码如下: func GetTriangleAreaByVector(x vector.Vector3,y vector.Vector3,z vector.Vector3) float64 { //根 ...

  9. 程序一直处于Accept状态,无法调度运行

    问题描述:在现场或测试环境偶尔会出现用户提交的程序一直处于Accept状态无法调度运行的现象 问题分析:出现这种问题的原因一般有以下两种: 1.用户程序提交的队列当前是否已达到最大可运行程序数,当达到 ...

  10. SparkSQL中产生笛卡尔积的几种典型场景以及处理策略

    [前言:如果你经常使用Spark SQL进行数据的处理分析,那么对笛卡尔积的危害性一定不陌生,比如大量占用集群资源导致其他任务无法正常执行,甚至导致节点宕机.那么都有哪些情况会产生笛卡尔积,以及如何事 ...