c/c++语言开发共享【C】EM卡韦根32/24格式卡号转换的实现

写在前面 第八周实验报告的deadline马上就要到了,大家都在奋笔疾书。这次的实验报告中有一个十分秃然的任务,要求学生用C语言编写一段代码,来处理编码问题。 我的ddl是在第七周,所以较早地解决了这个问题。但解决过程也是十分的秃然。鉴此,我决定分享一下这个任务的解决经验,希望给予需要的同学一点微薄 …


写在前面

第八周实验报告的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卡:

【C】EM卡韦根32/24格式卡号转换的实现

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 后段序列第一部分。

【C】EM卡韦根32/24格式卡号转换的实现

  • wiegand24_2 = (wiegand32 << 16) >> 16
    如图,先将 wiegand32 左移16位,消掉 30 ,得到的结果再右移16为,即为 wiegand24_2 后段序列第二部分。

【C】EM卡韦根32/24格式卡号转换的实现

  • wiegand32 = wiegand24_1 << 16 | wiegand 24_2
    如图,将左移16位的 wiegand24_1 与 wiegand 24_2 进行或运算,得到 wiegand32 前段序列。

【C】EM卡韦根32/24格式卡号转换的实现

  • wiegand24_1 >> 16
    如上图,对 wiegand24_1 左移16位后,应将其移回初始比特位,以便输出结果。

1.4 代码实现

看到这里,相信大家也能够独立实现代码的编写了。下面我提供一种实现方法:

#include<stdio.h>  int main() { 	int operand; 	int w32, w24_1, w24_2; 	printf("----------------------------------nn"); 	printf("  0tweige 32 -> weige 32/24n"); 	printf("  1tweige 24 -> weige 32/24n"); 	printf("  -1texitn"); 	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,%dn", 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,%dn", w32, w24_1, w24_2); 		} 	}  	return 0; } 

这段代码根据要求额外添加了操作数系统,可根据提示信息来选择操作模式,大家也可以上手体验一下。


写在最后

源心锁学长在去年也写了一篇关于em卡号转换的文章,c/c++开发分享【C】EM卡韦根32/24格式卡号转换的实现末代码的思路也和学长的思路大致相同,在此膜拜一下大佬。
终于赶在五一放假前敲完了这篇文章,实验人去肝报告了,没有时间排版……
最后祝大家假期快乐~

需要了解更多c/c++开发分享【C】EM卡韦根32/24格式卡号转换的实现,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/643454.html

(0)
上一篇 2021年7月2日
下一篇 2021年7月2日

精彩推荐