磁条卡基础

(39) 2024-04-12 10:01:01

接触一个知识就得记录下来,经验之谈很重要,隔一段时间就只记得自己干过这事,却不记得具体是啥事了。

谈谈物理原理

1、磁有正反两级,接触强磁可以改变附着材料的极性。这就是写磁道。

2、磁头通电,信号在经过放大,磁卡刷过时会得到如下的模拟信号。

磁条卡基础 (https://mushiming.com/)  第1张

如下是磁道3的数据磁条卡基础 (https://mushiming.com/)  第2张

 蓝色-磁头输入信号放大后的波形

黄色-峰值检测电路后二值化的波形

磁条卡基础 (https://mushiming.com/)  第3张

磁条卡基础 (https://mushiming.com/)  第4张

 开始刷卡时的波形(包含干扰信号和前导0)

磁条卡基础 (https://mushiming.com/)  第5张

 开始有数据了

磁道bit编码规则

磁条卡基础 (https://mushiming.com/)  第6张

 一句话概括:一个bit周期内有电平翻转,记作1,无电平翻转记作0.

那如何知道bit周期呢?所以就需要前导0,没注意到规范里要多少个前导0,建议10个以上。

每个bit-0占用一个bit周期,当找到足够多基本相同周期的脉宽,就标记为前导0,其周期就为bit周期。

 磁道数据编码规则

  • 磁道1的记录密度为210 bpi(8.27bits/mm),797位的二进制码(6ALPHA编码+1位奇校验位)
  • 磁道2的记录密度为75bpi(2.95bits/mm),405位的二进制码(4BCD编码+1位奇校验位)
  • 磁道3的记录密度为210bpi(8.27bits/mm),1075位二进制码(4BCD编码+1位奇校验位)

磁条卡基础 (https://mushiming.com/)  第7张磁条卡基础 (https://mushiming.com/)  第8张

 有了上面的规范及理论支持,就来解一解数据

磁条卡基础 (https://mushiming.com/)  第9张

  磁道3的起始字符为 ' ; ' ,bit存储由低位在前,拉开为 11010,从上就找到了起始信号。之后依次解析两个数据 00001=> 0 磁条卡基础 (https://mushiming.com/)  第10张,  00001=> 0 磁条卡基础 (https://mushiming.com/)  第10张

一直找到结束字符 '?'为止,字符'?'后一个为LRC校验,用于校验整个磁道数据的正确性。

 实际的三轨道数据如下,这么多数据当然要交给代码。

磁条卡基础 (https://mushiming.com/)  第12张

 编码解析bit

人眼可见,能直观看出脉宽长短,可见bit(0),bit(1).但是机器实现起来就有点不简单了。

如何分析出脉宽是0还是1。对机器而言得有规则。

ISO/IEC 7811-2: 2001(E)中有做规定,有条件可以自行查看

磁条卡基础 (https://mushiming.com/)  第13张

 磁条卡基础 (https://mushiming.com/)  第14张

规则中限定 0,85 Bin Bin+1 1,15 Bin,0,70 Bin/2 Sin+1 1,30 Bin/2,

上表允许脉宽实际和理论有15%的偏差。但实际受刷卡速度以及其他外界的干扰,并非如此理想。

刷卡速度不是稳定的,bit周期会变。所以我实际使用的规则如下:

解算磁道bit时会最多使用新的4个脉宽时间作为对比,四个脉宽时间记作d_0,d_1,d_2,d_3,2个bit周期记作Preiod

定义:

sum0_1 = d_0 +d_1

sum0_2 = sum0_1 + d_2

sum0_3 = sum0_2 +d_3

sum1_2 = d_1 +d_2

规则1、(d_0  > sum1_2 * 3 / 4)  时, d_0 记作 bit(0)

规则2、(d_2 > sum0_1 * 3 / 4)  时,d_0,d_1记作 bit(1) d_2 记作bit(0) ,更新Preiod = sum0_2

规则3、(d_0 >  d_2  * 2 * 3 / 4 &&  d_1 >  d_2  * 2 * 3 / 4 && d_2 <  d_3 * 5 / 4 && d_2  > track-> d_3 * 3 / 4)   时,d_0记作bit(0),d_1记作bit(0),d_2、d_3记作bit(1)   Preiod = sum0_3 * 2 / 3;

 前三个规则都是采用前后脉宽的比列关系做一次筛选。后面用bit周期做筛选标准。

规则4、 Preiod <= sum0_1 时,d_0记作bit(0),d_1记作bit(0)  ,更新Preiod = sum0_1

 还有很多规则就不一一陈述,越到后面,所渗透下来的数据就越离谱。

THE END

发表回复