寫在前面
第八周實驗報告的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格式 中的內容,我們可以畫出流程圖:
考慮到進制轉換問題,這里使用位運算可以簡化我們對數的操作,
下面對位運算陳述句進行解釋:
- 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卡號轉換的文章,本文末代碼的思路也和學長的思路大致相同,在此膜拜一下大佬,
終于趕在五一放假前敲完了這篇文章,實驗人去肝報告了,沒有時間排版......
最后祝大家假期快樂~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281575.html
標籤:其他
下一篇:自定義注解,你會了嗎?
