IC卡,能读出数据,但写入数据时总是出错!什么缘故?(卡是Simen4442) ( 积分: 100 )

  • 主题发起人 主题发起人 wu7509
  • 开始时间 开始时间
W

wu7509

Unregistered / Unconfirmed
GUEST, unregistred user!
function ckey_4442(icdev:longint;offset:smallint;password:array of integer):smallint;
stdcall; far;external 'YJRDIC.DLL' name 'ckey_4442';
function rdstr_4442(icdev:longint;offset:smallint;len:smallint;databuff:array of integer):smallint;
stdcall; far;external 'YJRDIC.DLL' name 'rdstr_4442';
function wrstr_4442(icdev:longint;offset:smallint;len:smallint;databuff:array of integer):smallint;
stdcall; far;external 'YJRDIC.DLL' name 'wrstr_4442';
function check_cardtype(icdev: longint; cardtype:array of integer):smallint;
stdcall; far;external 'YJRDIC.DLL' name 'check_cardtype';

//读
st:= rdstr_4442(1, 0 + i * 32, 32, recbuf);
//检验密码
for i:=1 to 6 do password:=1;
st:=ckey_4442(1, 3, password);
If st=0 Then memo1.lines.Add('检密码成功!')
else showmessage(inttostr(st));
//写
recbuf[0]:=ord('A'); recbuf[1]:=ord('B');
st:= wrstr_4442(1, 0 + 2 * 32, 32, recbuf);
If st=0 Then memo1.lines.Add('写成功!')
else showmessage(inttostr(st));
以上程序"读"与"检验密码"都能成功. 但第三段写不能成功!!
请高手们查看原因.谢谢!
 
function ckey_4442(icdev:longint;offset:smallint;password:array of integer):smallint;
stdcall; far;external 'YJRDIC.DLL' name 'ckey_4442';
function rdstr_4442(icdev:longint;offset:smallint;len:smallint;databuff:array of integer):smallint;
stdcall; far;external 'YJRDIC.DLL' name 'rdstr_4442';
function wrstr_4442(icdev:longint;offset:smallint;len:smallint;databuff:array of integer):smallint;
stdcall; far;external 'YJRDIC.DLL' name 'wrstr_4442';
function check_cardtype(icdev: longint; cardtype:array of integer):smallint;
stdcall; far;external 'YJRDIC.DLL' name 'check_cardtype';

//读
st:= rdstr_4442(1, 0 + i * 32, 32, recbuf);
//检验密码
for i:=1 to 6 do password:=1;
st:=ckey_4442(1, 3, password);
If st=0 Then memo1.lines.Add('检密码成功!')
else showmessage(inttostr(st));
//写
recbuf[0]:=ord('A'); recbuf[1]:=ord('B');
st:= wrstr_4442(1, 0 + 2 * 32, 32, recbuf);
If st=0 Then memo1.lines.Add('写成功!')
else showmessage(inttostr(st));
以上程序"读"与"检验密码"都能成功. 但第三段写不能成功!!
请高手们查看原因.谢谢!
 
卡在已经3次密码错误的情况下,
已经烧断,只能读不可写了
 
一般读写器都配有演示的DEMO程序的,你用人家的DEMO来试一试,如果也写下上,那就真是烧坏了,这种卡的特性就是可以在不效验密码的前提下,读出卡内容,如果三次校验密码出错,就会熔断保险丝了。然后就只能读不能写了。
 
我用人家的DEMO程序时,读出来的(密码错误计数)是0,也就是说并没有用过错密码!但用程序确实也是“写出错”
 
是否对于4442卡一定要先检验密码通过,然后再写入,才能正常写入数据,那检验密码与写入之间隔多长时间算有效呢?
 
计数器为0时一般都是卡已被销毁了(正常时为&quot;FF&quot;,卡密码校验未通过超过一定的次数<一般为8次>后为0)
 
我读卡的内容如下,是已经不能写入了吗?

0到255字节读取如下:
A213091FFFF8115FFFFFFFFFFFFFFFFFFFFFFD27600000400FFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
读取完成!
密码错误计数为:0
 
密码错误计数由卡商而定,要问卡商是怎么约定的。
demo程序有“校验密码”一项吧?试试就知道了
 
请问一般的IC卡,读与写各自的步骤是怎样的?
init_comm --> init_IC --> check_IC --> read_data --> Exit_comm
init_comm --> init_IC --> check_IC --> check_pass --> 加密内容 --> write_data --> Exit_comm?
 
demo&quot;校验密码&quot;中功能我随便输入什么密码,它都显示“验证密码成功”
 
哪家卡商提供的卡?
 
你的check_pass 能通过吗?
你应该问一下杭州大成的技术支持关于卡密码计数器的规定
 
你有没有设置卡的型号呀,我以前在用IC卡做开发的时候就遇到过这样的问题,老是出错,最后先设置了一下卡的型号,就没事了!
在写入数据之前!
 
请问一般的IC卡,读与写各自的步骤是怎样的?
init_comm --> init_IC --> check_IC --> read_data --> Exit_comm
init_comm --> init_IC --> check_IC --> check_pass --> 加密内容 --> write_data --> Exit_comm?
 
我启动程序时是先检测卡的类型的,不然读也没法读.
 
可能是这样的吧,试试
1.
function wrstr_4442(icdev:longint;offset:smallint;len:smallint;databuff:array of integer):smallint;
stdcall; far;external 'YJRDIC.DLL' name 'wrstr_4442';
wrstr_4442(1, 2, 32, recbuf);

2.
function wrstr_4442(icdev:longint;offset:smallint;len:smallint;var databuff):smallint;
stdcall; external 'YJRDIC.DLL' name 'wrstr_4442';

wrstr_4442(1, 2*sizeof(integer), 32, recbuf);

3.
function wrstr_4442(icdev:longint;offset:smallint;len:smallint; databuff : Pointer):smallint;
stdcall; external 'YJRDIC.DLL' name 'wrstr_4442';

wrstr_4442(1, 2*sizeof(integer), 32, @recbuf);
 
主要是你定义函数是不是有问题
 
写IC卡之前一定要校验密码,你可以写程序前校验一次密码,成功再调用写入程序
 
后退
顶部