首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi对IC卡编程初次者请问

2012-03-14 
delphi对IC卡编程初次者请教各位高手:小弟初次接触IC卡,只看了一些参考书,晕!想请教一些问题,谢谢!(用敏华

delphi对IC卡编程初次者请教
各位高手:
小弟初次接触IC卡,只看了一些参考书,晕!想请教一些问题,谢谢!(用敏华接触式读卡器)
1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?
2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中?
3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).
4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?
总之,对ic卡的知识极度匮乏,各位费心了!这好象和计算机的读写方式不一样吧

[解决办法]
我有一点 mifire 1的资料, 别的卡也大同小异,供参考

二、存储结构
1、M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:


块0 数据块0
扇区0 块1数据块1
块2数据块2
块3密码A 存取控制 密码B控制块3
块0数据块4
扇区1块1数据块5
块2数据块6
块3密码A 存取控制 密码B控制块7
∶      ∶      ∶
0数据块60
扇区15 1数据块61
2数据块62
3密码A 存取控制 密码B控制块63

2、第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。
3、每个扇区的块0、块1、块2为数据块,可用于存贮数据。
数据块可作两种应用:
★用作一般的数据保存,可以进行读、写操作。
★用作数据值,可以进行初始化值、加值、减值、读值操作。
4、每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:


密码A(6字节) 存取控制(4字节) 密码B(6字节)

5、每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位,定义如下:

块0: C10 C20 C30
块1: C11 C21 C31
块2: C12 C22 C32
块3: C13 C23 C33
三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如
进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制
位在存取控制字节中的位置,以块0为例:
 
对块0的控制:
bit 7 6 5 4 3 2 1 0
字节6C20_bC10_b
字节7C10C30_b
字节8C30C20
字节9
( 注: C10_b表示C10取反 )

存取控制(4字节,其中字节9为备用字节)结构如下所示:
bit 7 6 5 4 3 2 1 0
字节6C23_bC22_bC21_bC20_bC13_bC12_bC11_bC10_b
字节7C13C12C11C10C33_bC32_bC31_bC30_b
字节8C33C32C31C30C23C22C21C20
字节9
( 注: _b表示取反 )

6、数据块(块0、块1、块2)的存取控制如下:

控制位(X=0.1.2) 访 问 条 件 (对数据块 0、1、2)
C1XC2XC3X Read Write IncrementDecrement, transfer,Restore
000KeyA|BKeyA|BKeyA|BKeyA|B
010KeyA|BNeverNeverNever
100KeyA|BKeyBNeverNever
110KeyA|BKeyBKeyBKeyA|B
001KeyA|BNeverNeverKeyA|B
011KeyBKeyBNeverNever
101KeyBNeverNeverNever
111NeverNeverNeverNever
(KeyA|B 表示密码A或密码B,Never表示任何条件下不能实现)
例如:当块0的存取控制位C10 C20 C30= 1 0 0时,验证密码A或密码B正确后可读;
验证密码B正确后可写;不能进行加值、减值操作。

7、控制块块3的存取控制与数据块(块0、1、2)不同,它的存取控制如下:

密码A存取控制密码B
C13C23C33ReadWrite ReadWriteReadWrite
000NeverKeyA|BKeyA|BNeverKeyA|BKeyA|B
010NeverNeverKeyA|BNeverKeyA|BNever
100NeverKeyBKeyA|BNeverNeverKeyB
110NeverNeverKeyA|BNeverNeverNever
001NeverKeyA|BKeyA|BKeyA|BKeyA|BKeyA|B
011NeverKeyBKeyA|BKeyBNeverKeyB
101NeverNeverKeyA|BKeyBNeverNever
111NeverNeverKeyA|BNeverNeverNever
例如:当块3的存取控制位C13 C23 C33= 0 0 1时,表示:
密码A:不可读,验证KEYA或KEYB正确后,可写(更改)。
存取控制:验证KEYA或KEYB正确后,可读、可写。
密码B:验证KEYA或KEYB正确后,可读、可写。

新卡片中的控制字为:“FF 07 80 69”,其定义中说明密码A可用,密码B不可用,新卡中所有密码A都为6个字节的“FF”;

推荐的控制字
方案一:7F 07 88 69
此控制字说明:数据块:用密码A或B都可以读写;
控制块:密码A:由密码B来写,不可读;
密码B:由密码B来写,不可读;
控制字:用密码A或B都可读,由密码B写;
方案二:08 77 8F 69
此控制字说明:数据块:用密码A读,由密码B读写;
控制块:密码A:由密码B来写,不可读;
密码B:由密码B来写,不可读;
控制字:用密码A或B都可读,由密码B写;

三、卡片
卡片的电气部分只由一个天线和ASIC组成。
天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。
ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个
8K位EEPROM组成。

四、对数据块的操作 
读 (Read):读一个块;


写 (Write):写一个块;
加(Increment):对数值块进行加值;
减(Decrement):对数值块进行减值;
存储(Restore):将块中的内容存到数据寄存器中;
传输(Transfer):将数据寄存器中的内容写入块中;
中止(Halt):将卡置于暂停工作状态;

[解决办法]
1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗? 

给你卡的供应商,应该不是生产商,可能是一些做卡应用行业的公司,他们拿给你的卡,并且说已初始化,则很可能是加密码了,只能他们自己的设备来使用。
2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中? 
不会烧掉的。16个扇区,除了0扇区的密码不提供外,其他的都是12个f
3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错). 
这个不懂。
4.据说每次对卡的操作都要经过上下电的程序,这是什么意思? 
这个也不懂。
总之,对ic卡的知识极度匮乏,各位费心了!这好象和计算机的读写方式不一样吧

附资料,你看一下:http://baike.baidu.com/view/4189.htm
[解决办法]
1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗? 
给你卡的供应商,应该不是生产商,可能是一些做卡应用行业的公司,他们拿给你的卡,并且说已初始化,则很可能是加密码了,只能他们自己的设备来使用。 haochin回答的正确,应该是供应商提前将卡内设置密码了,你在读写该卡时都需要用密码提前验证,因此你必须问供应商要到该密码。

2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中? 
确切的说如果密码多次错误,会导致卡锁死,倒不至于烧掉,当然卡锁死的话,也就不能再对该卡进行读写了。至于密码,是厂家自己定的出厂密码,肯定会告诉你的,否则你读写卡是无法通过密码验证,而且这个密码一般还允许自行设定,所以你编程的时候肯定要用的密码。
3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错). 
数据的读写一般是2进制或16进制,而是否需要知道地址,这个需要根据厂家提供的通讯协议来确定
4.据说每次对卡的操作都要经过上下电的程序,这是什么意思? 
上下电是一次读写卡的操作步骤而已,你想象成开始,结束就行。比如一次读写卡的步骤是:上电,判断读卡器有卡,验证卡密码,读写卡数据,下电

[解决办法]
要回答你的问题,首先要搞清楚你用的是接触式的IC卡还是非接触式的IC卡
前面的回答均是针对非接触式IC卡来的,但我看你用的应该是接触式的IC卡,应为你提到你用的是明华的接触式读写器。

如果你用的是接触式的IC卡,那么答案应该就不一样了。
1:两种卡是一样的,初始化的意思应该是修改了原始的密码,也即是说已经写了新密码了
2:非接触式IC卡的密码可以随便校验,密码错了再试多少次也没有问题,但接触式的IC卡应该是试了N次后卡会被锁死的。如果你要对其编程,一般来说两种卡都需要知道密码。
3:读写卡要通知读写器我要读写哪个区那个块
4:卡内有芯片,存储了数据,没有电怎么读?只不过两种卡的电的来源不一样。

一般明华的读写器都附带有很详细的说明,你可以看看说明。
[解决办法]
你可以将卡理解成一张白纸,你要做的事情就是通过程序控制能向这张纸写字的笔(也就是读卡器)操作这张纸。
1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗? 
答:我估计和你联系的应该是供应商而不是生产商。二者区别在于生产商提供的卡片都是白卡(也可以理解成一张白纸,即使有密码也是公开的,关于密码问题我在回答你的第二个问题时再多说几句),而供应商很可能是和卡配套软件的提供者,他们为了自己的利益(同时也可以提高系统的安全性),修改卡的密码,同时将部分初始信息写入卡内,这就是所谓的“初始化”。

2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中? 
答:首先,你应明确你卡的型号(这是你的所有问题中最最重要的,也是要准确回答你的问题前所必须知道的)。目前,市场上常见的卡片有id卡(非接触式,多用于学校或企业一卡通,无密码),逻辑加密卡(目前应用较少,以前的Ic卡电话或某些地区的驾驶员卡均属此类,有密码),非接触卡(典型型号为2楼提到的mifare系列,常应用于各地区城市一卡通,或公交卡,及企业及学校一卡通等,mifare系列有密码,其他多无密码),cpu卡(价格较高,只在银行等少数领域应用,有密码)等等。其中逻辑加密卡或cpu卡如连续几次密码错误,卡会烧掉,mifare不会烧卡(因你提到会烧卡,所以我估计你的卡不是mifare系列的)。如生产商提供卡片,密码均为初始密码,如软件供应商提供,则非常可能被其修改,且不愿提供(不提供,你只能从他那里买卡,提供了,你可以随处买卡)。编程时,密码是否要写在程序中应视你要实现的目的而定,多数逻辑加密卡不需密码即可读卡,其他带密码的卡通常需密码认证通过后才可读取数据,但各种带密码的卡基本上都是密码认证通过后才可写卡的,所以估计你很可能要将密码写入程序中。

3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).
答:什么进制是无所谓,关键是看你调用的读卡器的函数接口是哪个数据类型(例如是数字类型,则你传入16进制的FF和10进制的255效果是一样的,但如是字符串类型,你就必须按照对方要求来使用了)至于具体地址数,这个问题还是要看具体型号了。对于非cpu卡来说,型号确定就意味着卡的容量等特性确定,而cpu卡都有自己的cos(即操作系统),就只能看cos手册了。至于是否块操作,也和卡的类型和型号有关,逻辑加密卡多是按字节操作,mifare等卡是块操作(以最常见的mifare 1 s50来说,以块为单位操作,每块16字节。也就是说,你即使想读写1个字节,也需要读写该字节所在块的那16个字节),至于cpu卡,其自身有操作系统,多为文件操作。
 
4.据说每次对卡的操作都要经过上下电的程序,这是什么意思? 
答:多数卡本身是无源的,因此操作时必须先上电,至于下电,实际上对很多卡来说不是必须的(但强烈建议你执行下电步骤)。举个例子来说,你向计算机插入了一个u盘,不正常停止后再拔出u盘通常也没问题,但恐怕没有几个人不停止后再拔出u盘的。
说了不少,但因为不知道具体卡的具体类型和型号,无法给出非常准确的解决方案。需要lz先明确型号,才可以详细讨论如何解决。
^_^
[解决办法]
1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?
答:初始化就是向IC卡里写入了认证密码(IC卡出厂的时候默认为空密码),对写入认证密码之后的IC卡读写,必须使用相同的密码认证,否则就无法对IC卡读写,应用程序的初始化应该是读卡器芯片的初始化吧。你拿的IC卡,发卡操作时读卡器就对IC卡进行了初始化。


2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中? 
答:这个密码是读卡器和IC卡之间通讯的认证秘钥,如果供应商不原意提供,就是说读卡器初始化卡的时候写入了一个只有读卡器供应商知道的、固定的密码,你就不需要管这个密码了。如果读卡器厂商提供的应用接口可以改写这个密码,你就要管理起这个密码了。也就是初始化卡时你写入什么密码,你读写这些初始化过的卡时,必须使用相同的密码来认证。
3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).
答:卡存储分块,区。不同的卡容量不同,根据卡片类型对应处理。 
4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?
答:上电有点奇怪,如果卡片拿到了读卡器的射频区(读卡器通过固定频率如13.56M发射射频能量,通讯的编码调制在这个固定频率上),IC卡的线圈接收射频能量,可能就几个mS,IC卡的电路充电后就可以正常工作了,也就算是上电吧。IC卡的内容读写之前需要一系列的认证步骤。真正的下电就是把IC卡从读卡器的射频区移开。这里的下电可能是指IC卡的IDLE吧,IC卡休眠之后就不再响应读卡器的通讯请求了(当然如果从射频区移开,IC卡电路冷重启之后就可以相应请求了)。因为读卡器读卡是快速定时扫描的,比如1秒钟50次,如果你不休眠,可能会在你刷卡的一两秒钟之间,发生多次读写(可能就多次扣钱了,呵呵)。

[解决办法]
1)有区别
2)密码由用户输入
3)你用的可能是纯数据存储卡
4)没听说过。

[解决办法]

探讨
你可以将卡理解成一张白纸,你要做的事情就是通过程序控制能向这张纸写字的笔(也就是读卡器)操作这张纸。
1.向生产卡的供应商拿了几张卡,他告诉我已做了初始化,这是什么意思,我在一些参考书上关于IC卡的应用程序上也有初始化程序,这两者有区别吗?我拿了这些供应商提供的卡还需初始化吗?
答:我估计和你联系的应该是供应商而不是生产商。二者区别在于生产商提供的卡片都是白卡(也可以理解成一张白纸,即使有密码也是公开的,关于密码问题我在回答你的第二个问题时再多说几句),而供应商很可能是和卡配套软件的提供者,他们为了自己的利益(同时也可以提高系统的安全性),修改卡的密码,同时将部分初始信息写入卡内,这就是所谓的“初始化”。

2.书上说对卡的读写首先需要检验密码,连续几次密码错误,卡会烧掉,则密码供应商是否会提供(据说供应商不愿提供),在我编程的时候密码是否要写在程序中?
答:首先,你应明确你卡的型号(这是你的所有问题中最最重要的,也是要准确回答你的问题前所必须知道的)。目前,市场上常见的卡片有id卡(非接触式,多用于学校或企业一卡通,无密码),逻辑加密卡(目前应用较少,以前的Ic卡电话或某些地区的驾驶员卡均属此类,有密码),非接触卡(典型型号为2楼提到的mifare系列,常应用于各地区城市一卡通,或公交卡,及企业及学校一卡通等,mifare系列有密码,其他多无密码),cpu卡(价格较高,只在银行等少数领域应用,有密码)等等。其中逻辑加密卡或cpu卡如连续几次密码错误,卡会烧掉,mifare不会烧卡(因你提到会烧卡,所以我估计你的卡不是mifare系列的)。如生产商提供卡片,密码均为初始密码,如软件供应商提供,则非常可能被其修改,且不愿提供(不提供,你只能从他那里买卡,提供了,你可以随处买卡)。编程时,密码是否要写在程序中应视你要实现的目的而定,多数逻辑加密卡不需密码即可读卡,其他带密码的卡通常需密码认证通过后才可读取数据,但各种带密码的卡基本上都是密码认证通过后才可写卡的,所以估计你很可能要将密码写入程序中。

3.听说对数据的读写都是十六制的并且要知道地址,如何知道卡的具体地址数(听说是块操作,且每个块都要一次性写满,否则出错).
答:什么进制是无所谓,关键是看你调用的读卡器的函数接口是哪个数据类型(例如是数字类型,则你传入16进制的FF和10进制的255效果是一样的,但如是字符串类型,你就必须按照对方要求来使用了)至于具体地址数,这个问题还是要看具体型号了。对于非cpu卡来说,型号确定就意味着卡的容量等特性确定,而cpu卡都有自己的cos(即操作系统),就只能看cos手册了。至于是否块操作,也和卡的类型和型号有关,逻辑加密卡多是按字节操作,mifare等卡是块操作(以最常见的mifare 1 s50来说,以块为单位操作,每块16字节。也就是说,你即使想读写1个字节,也需要读写该字节所在块的那16个字节),至于cpu卡,其自身有操作系统,多为文件操作。

4.据说每次对卡的操作都要经过上下电的程序,这是什么意思?
答:多数卡本身是无源的,因此操作时必须先上电,至于下电,实际上对很多卡来说不是必须的(但强烈建议你执行下电步骤)。举个例子来说,你向计算机插入了一个u盘,不正常停止后再拔出u盘通常也没问题,但恐怕没有几个人不停止后再拔出u盘的。
说了不少,但因为不知道具体卡的具体类型和型号,无法给出非常准确的解决方案。需要lz先明确型号,才可以详细讨论如何解决。
^_^

[解决办法]
给你点实际的吧,我前几天做的IC写卡程序,都在用基本没问题,读卡器不一样但原理和过程是类似的。

基本流程:
1.初始化串口通讯,
2.检查读卡器状态,
3.检验卡型,
4.检验密码,
5.写卡/读卡,
6.修改密码及及其它,
7.退出


先看界面:



[解决办法]
代码部分:

Delphi(Pascal) code
unit WriteIC4428_RemovingEndNum;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Buttons;type  TPCH_Write_IC_Card4428 = class(TForm)    rb_IsWriteMainCard: TRadioButton;    lst_ReadWriteInfo: TListBox;    rb_IsWriteAttachCard: TRadioButton;    grp__1: TGroupBox;    grp__2: TGroupBox;    lbl_1: TLabel;    lbl_2: TLabel;    lbl_3: TLabel;    grp__3: TGroupBox;    lbl_4: TLabel;    edt_CardPWD: TEdit;    lbl_5: TLabel;    edt_WritePosition_Byte: TEdit;    lbl_7: TLabel;    btn_OpenInterface: TBitBtn;    btn_VerifyCardPwd: TBitBtn;    btn_ReadCard: TBitBtn;    btn_ClearListBoxRec: TBitBtn;    btn_Exit: TBitBtn;    btn_WriteCard: TBitBtn;    edt_CardMainNo: TEdit;    edt_CardFirstNo: TEdit;    edt_AttachCardEndNo: TEdit;    grp__4: TGroupBox;    edt_WriteCardNum: TEdit;    lbl_6: TLabel;    btn_ChangeCardPWD: TBitBtn;    btn_ClosePort: TBitBtn;    procedure btn_OpenInterfaceClick(Sender: TObject);    procedure btn_VerifyCardPwdClick(Sender: TObject);    procedure btn_WriteCardClick(Sender: TObject);    procedure btn_ExitClick(Sender: TObject);    procedure btn_ReadCardClick(Sender: TObject);    procedure btn_ChangeCardPWDClick(Sender: TObject);    procedure btn_ClearListBoxRecClick(Sender: TObject);    procedure btn_ClosePortClick(Sender: TObject);    procedure FormClose(Sender: TObject; var Action: TCloseAction);    procedure edt_CardMainNoChange(Sender: TObject);    procedure edt_AttachCardEndNoChange(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;var  PCH_Write_IC_Card4428: TPCH_Write_IC_Card4428;  ClickNum:Integer;  MainCardNum:string[10];  RW_MainCardNum:string[20];  RW2_MainCardNum:string[44];  RW2_AttachCardNum:string[48];// ----------------------------------------------  icdev:longint;  st:smallint;  outbuff:pchar; //输出缓冲区_主卡  inbuff:string; //输入缓冲区implementation{$R *.dfm}uses drv_unit_D6;// 打开串口procedure TPCH_Write_IC_Card4428.btn_OpenInterfaceClick(Sender: TObject);begin//  ClickNum:=0;  icdev := IC_InitComm(100);    If icdev < 0 Then      begin          lst_ReadWriteInfo.Items.Add('打开端口出错!请检查端口是否被占用或设备是否已连接!');        exit;         end     else        begin      lst_ReadWriteInfo.Items.Add('打开端口成功!');             PCH_Write_IC_Card4428.btn_VerifyCardPwd.Enabled:=True;            PCH_Write_IC_Card4428.btn_WriteCard.Enabled:=True;            PCH_Write_IC_Card4428.btn_ReadCard.Enabled:=True;            PCH_Write_IC_Card4428.btn_ChangeCardPWD.Enabled:=True;      PCH_Write_IC_Card4428.btn_ClosePort.Enabled:=True;    end;    st := IC_Status(icdev);    If st <0 Then begin        lst_ReadWriteInfo.Items.Add('读写器存在错误!');        exit;    end;    lst_ReadWriteInfo.Items.Add('读写器状态正常!');    If st >0 Then    If st = 1 then      begin        Windows.Beep(300,600);              lst_ReadWriteInfo.Items.Add('>>>>>>>>>>>没有检测到卡,请重新插卡!');        st := IC_ExitComm(icdev);     //关闭串口               icdev:=0;      end    else        lst_ReadWriteInfo.Items.Add('检测到卡!');    st := IC_InitType(icdev, 4);              //给卡型号    If st = 0 Then      begin            lst_ReadWriteInfo.Items.Add('卡型检测成功!');            Exit;        End  else      lst_ReadWriteInfo.Items.Add('卡型检测失败!');end;//校验密码procedure TPCH_Write_IC_Card4428.btn_VerifyCardPwdClick(Sender: TObject);begin    st := IC_ReadCount_SLE4428(icdev);    If st < 0 Then begin        lst_ReadWriteInfo.Items.Add('读芯片SLE4428、4442出错!');        Exit;    End;    lst_ReadWriteInfo.Items.Add('读芯片SLE4428、4442成功!');     lst_ReadWriteInfo.Items.Add('错误记数器为'+inttostr(st));     inbuff:=string(edt_CardPWD.Text);                //核对密码     st := IC_CheckPass_4428hex(icdev,pchar(inbuff));     If st <> 0 Then begin        lst_ReadWriteInfo.Items.Add('密码校验失败!');        Exit;     End;     lst_ReadWriteInfo.Items.Add('密码校验成功!');end; 

热点排行