{*******************************************************} { } { 陈新光 } { } { 版权所有 (C) 2007 咏南工作室 } { } {*******************************************************} unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, SPComm; type TForm1 = class(TForm) btnRead: TButton; btnWrite: TButton; edt1: TEdit; btnClear: TButton; lbl1: TLabel; procedure btnClearClick(Sender: TObject); procedure btnWriteClick(Sender: TObject); procedure btnReadClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; function RTr2card(comn,inTr2str:pchar):Integer;stdcall;external'rwcommnew.dll'; function WTr2card(comn,inTr2str:string):Integer;stdcall;external'rwcommnew.dll'; implementation {$R *.dfm} procedure TForm1.btnClearClick(Sender: TObject); begin edt1.Clear; end; procedure TForm1.btnWriteClick(Sender: TObject); begin if WTr2card('com1',edt1.Text)<>1 then ShowMessage('error'); end; procedure TForm1.btnReadClick(Sender: TObject); var comm,s:string; begin comm := 'com1'; SetLength(s, 1024); if RTr2card(pchar(comm),pchar(s))<>1 then ShowMessage('error') else edt1.text := s; end; end. 可单读、写二或三磁道,也可同时读、写二、三磁。 此例程使用厂家提供的DLL,只对二磁道进行读、写。 2007-10-6 8:26:42 发表评语»»» 2007-10-6 8:29:36 磁卡知识 磁卡知识 磁 卡 1、磁卡分类 磁条型:一般抗磁力卡(300oe) 高抗磁力卡 (3500oe) 直接涂印型:低抗磁力卡(300oe) (如:公园门票) 高抗磁力卡(2700oe)(如:地铁卡、电话卡) 2.磁条和磁道 磁条上有3个磁道。磁道1与磁道2是只读磁道,在使用时磁道上记录的信息只能读出而不允许写或修改。磁道3为读写磁道,在使用时可以读出,也可以写入。 磁道1可记录数字(0-9)、字母(A-Z)和其他一些符号(如括号、分隔符等),最大可记录79个数字或字母。 磁道2和3所记录的字符只能是数字(0-9)。磁道2最大可记录40个字符,磁道3最大可记录107个字符。 3.磁卡读写器 一般非金融领域用磁卡,只将信息记录在第2磁道,单2轨的只读阅读器售价400元/台,单2轨的可读可写的读写器售价1800元/台。 金融领域用磁卡,磁道1、2、3都可能用,如工行用1、3磁道,建行用2、3磁道。1、2、3磁道均可读写的读写器售价4800元/台。 以上可看出,磁卡的阅读器很便宜,但读写器较贵,由于一般的应用中,磁卡只记录个人帐号等只读信息,使用时并不往卡中写信息,所以很多客户会让我公司出厂时,将信息代写入磁卡中,即“写磁”加工。卡本身在我厂生产的,“写磁”费0.05元/张,卡不在我厂生产的,“写磁”费0.2--0.3元/张。 4.磁卡的安全及存在问题 A.卡的保密性和安全性较差 磁条上的信息比较容易读出,非法修改磁条上的内容也较容易,所以大多情况下磁卡都是作为静态数据输入使用。虽然第3磁道可读写,并且有金额字段,也只是用于小金额的应用领域,例如电话卡。 B.使用磁卡的应用系统需要有可靠的计算机系统和中央数据库的支持 在金融行业,作为金融交易卡的磁卡,一般配合强大、可靠的计算机网络系统使用,金额、交易记录等信息,均保存在金融机构计算机的数据库中,用户所持的卡片只是提供用户的主帐号等索引信息,便于在数据库中迅速找到用户数据。 磁卡国际标准 1.ISO 7810:1985 识别卡 物理特性 规定了卡的物理特性,包括卡的材料、构造、尺寸。 卡的尺寸为:宽度 85.72mm----85.47mm 高度 54.03mm----53.92mm 厚度 0.76±0.08mm 卡片四角圆角半径 3.18mm 一般讲卡的尺寸为:85.5 X 54 X 0.76 2.ISO 7811-1:1985 识别卡 记录技术 第1部分:凸印 规定了卡上凸印字符的要求(字符集、字体、字符间距和字符高度)。 3.ISO 7811―2:1985 识别卡 记录技术 第2部分:磁条 规定了卡上磁条的特性、编码技术和编码字符集。 4.ISO 7811―3:1985 识别卡 记录技术 第3部分:ID-1型卡上凸印字符的位置 5.ISO 7811―4:1985 识别卡 记录技术 第4部分:只读磁道的第1、2磁道位置 6.ISO 7811―5:1985 识别卡 记录技术 第5部分:读写磁道的第3磁道位置 2007-10-6 10:08:10 {*******************************************************} { } { 陈新光 } { } { 版权所有 (C) 2007 咏南工作室 } { } {*******************************************************} unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, SPComm; type TForm1 = class(TForm) btnRead: TButton; btnWrite: TButton; edt1: TEdit; btnClear: TButton; lbl1: TLabel; lbl2: TLabel; edtCardId: TEdit; lbl3: TLabel; edtNum: TEdit; procedure btnWriteClick(Sender: TObject); procedure btnReadClick(Sender: TObject); procedure btnClearClick(Sender: TObject); private { Private declarations } function FindStr(ShortStr: String; LongStrIng: String): Integer; //返回子串在字符串中的位置 public { Public declarations } end; var Form1: TForm1; function RTr2card(comn,inTr2str:pchar):Integer;stdcall;external'rwcommnew.dll'; function WTr2card(comn,inTr2str:string):Integer;stdcall;external'rwcommnew.dll'; implementation {$R *.dfm} procedure TForm1.btnWriteClick(Sender: TObject); begin if WTr2card('com1',edt1.Text)<>1 then ShowMessage('error'); end; procedure TForm1.btnReadClick(Sender: TObject); var comm,s:string; i:Integer; begin comm := 'com1'; SetLength(s, 1024); //必须预先分配内存 if RTr2card(pchar(comm),pchar(s))<>1 then ShowMessage('error') //取磁卡存储内容 else edt1.text := s; s:=Copy(edt1.Text,1,8); //取会员卡号(固定为8位,不足8位的前面补0) edtCardId.Text:=IntToStr(StrToInt(s)); i:=FindStr('42',edt1.Text)-2; //取会员积分(从第12位始,至'42'子串前两位) edtNum.Text:=Copy(edt1.Text,12,i-12); end; function TForm1.FindStr(ShortStr, LongStrIng: String): Integer; var locality: integer; begin locality := Pos(ShortStr, LongStrIng); if locality = 0 then Result := 0 else Result := locality; end; procedure TForm1.btnClearClick(Sender: TObject); var i:Integer; begin for i:=0 to ComponentCount-1 do if Components[i] is TEdit then (Components[i] as TEdit).Clear; end; end.