Mark Xu 的博客

记录精彩的程序人生

IC 卡号类别与转换

关于 IC 卡 10 位卡号转换问题,今年已经计算过好几遍了,今天要用到时发现又捋不清了,特此记录下来。

重点

各个厂家读卡器译码格式不同,但是读出的二进制或十六进制结果一定是唯一的,也就是原始卡号,这一点很关键。

不同的读卡方式的区别在于,从十六进制卡数据中,截取一段数据转换为十进制,再将多次截取转换好的数据进行拼接。各个厂家的读卡器输出都不太一样,但基本上是按一定的标准输出,下面我们来看看常见的读卡格式。

常见卡号格式

以 IC 卡为例,0 扇区 0 块数据为:3A 6C 6F 02 01 88 04 00 47 B9 94 d6 45 80 37 09

由于低位在前,所以得到的 10 位十六进制 ASCII 字符串为:01 02 6f 6c 3a

格式一:10 位十六进制的 ASCII 字符串

示例:

01 02 6f 6c 3a

格式二:10 位十进制卡号

将格式一中后八位,即 02 6f 6c 3a 转换为十进制,结果为:

0040856634 // 不足 10 位进行补零

格式三:8 位十进制卡号(W26 直转格式)

将格式一中后六位,即 6f 6c 3a 转换为十进制,结果为:

07302202 // 不足 8 位进行补零

格式四:8 位十进制卡号(3 位 + 5 位)(W26 标准格式)

  • 将格式一中第五、六位,即 6f 取出,转换为十进制得到:111,不足三位补零即可
  • 将格式一中第七、八、九、十位,即 6c 3a 取出,转换为十进制得到:27706,不足五位补零即可
  • 最后将转换好的两个十进制数据拼接即可,得到:11127706

格式五:8 位十进制卡号(3 位 + 5 位)

  • 将格式一中三、四、五、六位取出,即 02 6f 转换为十进制得到:623,不足三位补零即可
  • 将格式一中七、八、九、十位取出,即 6c 3a 转换为十进制得到:27706,不足五位补零即可
  • 两个十进制数据拼接得到:62327706

10 位卡号和 8 位卡号互转

国内考勤机厂商经常采用的是直接读取卡号的内码,即 10 位卡号,如:3731186212。也就是我们上面所说的 格式二:10 位十进制卡号,理解了上面各种卡号格式的区别,转换就很简单了吧!

3731186212 转换为十六进制为:DE 65 62 24,这一串数字为十六进制原始数据中的一段。

  • 丢弃第一个字节 DE
  • 取第二个字节 65,转换为十进制为:101
  • 取第三、四个字节 62 24,转换为十进制为:25124

拼接到一起就得到了韦根 26 标准 8 位卡号:10125124

但是我们的门口机设备刷卡识别出来的卡号是 06644260,这又是怎么回事呢?

如果我们将刚才拿到的 10 位卡号的十六进制的后面三个字节:0x 65 62 24,不经过拆分,直接转换为十进制,得到:6644260。也就是 W26 直转格式啦!

拓展:韦根 26 协议

Wiegand 接口通常由 3 根线组成,它们是:数据 0(Data0),数据 1(Data1)和 Data return。这 3 条线负责传输 Wiegand 信号。
标准韦根 26 输出是由 26 位二进制数组成,每一位的含义如下:

  • 第 1 位为 2—13 位的偶校验位
  • 第 2—9 位对应与电子卡 HID 码的低 8 位
  • 第 10-25 位对应电子卡的 PID 号码
  • 第 26 位为 14-25 位的奇校验位
  • 这 26 位数据在读出器的韦根输出线 D0,D1 上输出

其中 PID 号码即为我们上面所说的卡号,占 16 位二进制位,即 4 位十六进制位。

参考

ID 卡卡号格式输出说明

EM 卡 10 位转 8 位卡号的原理和方法

什么是 Wiegand 协议?什么是韦根 26? 什么是韦根 34?

留下你的脚步