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格式 中的内容,我们可以画出流程图:
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”)