📄 读卡函数.prg
字号:
****************************************************
*************************************************** 读卡函数
*****************************************************
*读卡函数
&&例如 ok=读磁卡(1,"3",200,10,"请刷要复制的源盘","","")
proc 读磁卡
para ncom口,c磁道,n值长度,n等待时长,c动作名称,C识别型号,c读卡参数
*C识别型号="" &&如果屏去此句命令,则将检验机器是否是指定产品
if type("C读卡参数")<>"C" .or. empty(C读卡参数)
c读卡参数="9600,n,8,1"
endif
c磁道标志=""
do case
case c磁道="23"
c磁道标志="B"
n值长度=n值长度+9 &&要加上头尾打包码
case c磁道="3"
c磁道标志="T"
n值长度=n值长度+9
case allt(c磁道)="2"
c磁道标志=""
n值长度=n值长度+7
endcase
comm1=createobject("mscommlib.mscomm.1")
comm1.commport=ncom口 &&//指定COM口工作
if comm1.portopen &&=.f.
messagebox("指定的串口"+allt(str(ncom口))+"正在使用中!",0,"提示")
return "读卡错误"
endif
comm1.portopen=.t. &&//打开指定的COM口
*//设置传输速率,奇偶校验,数据位,停止位
comm1.settings=c读卡参数
************************************磁卡机校验机型开始
if .not. empty(C识别型号)
=H_设立等待("正在识别设备型号......")
comm1.output=CHR(27)+"V"
for n=1 to 10
=inkey(0.5,'hm')
ctemp=comm1.input
if .not. empty(ctemp)
exit
endif
endfor
if upper(allt(ctemp)) <> UPPer(allt(C识别型号))
=H_设立等待("读卡机不是指定设备,请按任意键返回"+ctemp)
=inkey(0,"hm")
=H_消除等待()
return "读卡错误" &&型号不对,强行跳出
endif
=H_消除等待()
endif
************************************磁卡机校验机型结束
=H_设立等待(c动作名称) &&开始读卡
indata1="" &&//变量初始化
*//从接收缓冲区读出字符串
*comm1.outsettings="9600,n,8,1"
comm1.output=CHR(27)+c磁道标志+"]" + CHR(27)+"j" &&B 23道 T 3 2道37 3道100
indata=""
injc="没有读卡"
lok=.f. &&判断刷卡是否正确
for n=1 to n等待时长*2
ckey=inkey(0.5,'hm')
if ckey=27 &&ESC
=H_设立等待("用户终止本次操作,请按任意键返回")
=inkey(1,'hm')
exit
endif
comm1.inputlen=n值长度
indata=comm1.input
if empty(indata)
loop
endif
do case
case c磁道="23" &&最后码是1b"BRP" 或 1b"BRQ"
injc=substr(indata,3,len(indata)-8)
incheck=substr(indata,len(indata)-4+1,4)
if incheck=chr(27)+"B"+"r"+"p"
lok=.t.
else
lok=.f.
endif
case c磁道="3" &&最后码是1b TRP 或 1b TRQ
injc=substr(indata,3,len(indata)-8)
incheck=substr(indata,len(indata)-4+1,4)
if incheck=chr(27)+"T"+"r"+"p"
lok = .t.
else
lok=.f.
endif
case allt(c磁道)="2" &&最后码是1b"RP" 或 1b"RQ"
injc=substr(indata,3,len(indata)-7)
incheck=substr(indata,len(indata)-3+1,3)
if incheck=CHR(27)+"r"+"p"
lok=.t.
else
lok=.f.
endif
endcase
* wait windows "|"+indata+"|"+injc+"|"+incheck+"|" nowait
if lok
=H_设立等待("读卡经校验正确")
=inkey(1,'hm')
else
=H_设立等待("读卡后发现校验失败,请按任意键返回")
injc="读卡错误"
=inkey(0,'hm')
endif
=H_消除等待()
exit
endfor
if injc="没有读卡"
=H_消除等待()
=H_设立等待("读卡机没有发现刷卡动作,请按任意键返回")
=inkey(0,"hm")
=H_消除等待()
injc="读卡错误"
endif
comm1.output=CHR(27)+"0"
=H_消除等待()
return injc &&注意返回值是读卡错误
****************************************************
*************************************************** 写卡函数
*****************************************************
*ok=写磁卡(1,"3",200,"123456789877",20,"请刷要制作新存折","","")
proc 写磁卡
para ncom口,c磁道,n值长度,c写入值,n等待时长,c动作名称,C识别型号,c读卡参数
*C识别型号="" &&如果屏去此句命令,则将检验机器是否是指定产品
if type("C读卡参数")<>"C" .or. empty(C读卡参数)
c读卡参数="9600,n,8,1"
endif
c磁道标志=""
do case
case c磁道="23" &&要检测是否带A的标志
*c磁道标志="B"
if .not. "A" $ c写入值
=H_设立等待("写入数据没有带'A'标志来所以只写入第二磁道,请按任意键")
=inkey(1,"hm")
=H_消除等待()
c磁道="2"
endif
case c磁道="3"
if .not. subst(C写入值,1,1)="A"
C写入值="A"+c写入值
endif
case allt(c磁道)="2"
if "A" $ C写入值
=H_设立等待("写入数据带'A'标志将自动写入两个磁道,请按任意键")
=inkey(1,"hm")
c磁道="23"
=H_消除等待()
endif
endcase
comm1=createobject("mscommlib.mscomm.1")
comm1.commport=ncom口 &&//指定COM口工作
if comm1.portopen &&=.f.
messagebox("指定的串口"+allt(str(ncom口))+"正在使用中!",0,"提示")
return .f.
endif
comm1.portopen=.t. &&//打开指定的COM口
*//设置传输速率,奇偶校验,数据位,停止位
comm1.settings=c读卡参数
************************************磁卡机校验机型开始
if .not. empty(C识别型号)
=H_设立等待("正在识别设备型号......")
comm1.output=CHR(27)+"V"
for n=1 to 10
=inkey(0.5,'hm')
ctemp=comm1.input
if .not. empty(ctemp)
exit
endif
endfor
if upper(allt(ctemp)) <> UPPer(allt(C识别型号))
=H_设立等待("读卡机不是指定设备,请按任意键返回"+ctemp)
=inkey(0,"hm")
=H_消除等待()
return .f. &&型号不对,强行跳出
endif
=H_消除等待()
endif
************************************磁卡机校验机型结束
=H_设立等待(c动作名称)
indata=C写入值 &&//变量初始化
comm1.output=CHR(27)+"t"+indata+CHR(29)+CHR(27)+"\"+CHR(27)+"j"
incheck="没有写卡"
lok=.f.
for n=1 to n等待时长*2
ckey=inkey(0.5,'hm')
if ckey=27 &&ESC
=H_设立等待("用户终止本次操作,请按任意键返回")
=inkey(1,'hm')
exit
endif
comm1.inputlen=20
incheck=comm1.input
if empty(incheck)
loop
endif
do case
case c磁道="23" &&最后码是1b"BRP" 或 1b"BRQ"
if incheck=chr(27)+"B"+"r"+"p"
lok=.t.
else
lok=.f.
endif
case c磁道="3" &&最后码是1b TRP 或 1b TRQ
if incheck=chr(27)+"T"+"r"+"p"
lok = .t.
else
lok=.f.
endif
case allt(c磁道)="2" &&最后码是1b"RP" 或 1b"RQ"
if incheck=CHR(27)+"r"+"p"
lok=.t.
else
lok=.f.
endif
endcase
exit
endfor
*wait windows "|"+indata+"|"+incheck+"|" nowait
=h_消除等待()
if incheck=="没有写卡"
=H_设立等待("读卡机没有发现刷卡动作,请按任意键返回")
=inkey(0,'hm')
indata="密码失败"
else
if lok
=H_设立等待("写卡成功")
=inkey(1,'hm')
else
=H_设立等待("写卡失败,请按任意键返回")
=inkey(0,'hm')
endif
endif
comm1.output=CHR(27)+"0"
=h_消除等待()
return lok &&.t.表示成功 .f.表示失败
***************************************************************
**************************************************************
**************************************************************
*=读键盘(1,"第一次",6,20,"用户第一次输入口令",)
proc 读键盘
para ncom口,c密码次数,n密码长度,n等待时长,c动作名称,C识别型号,c串口参数
C识别型号="" &&如果屏去此句命令,则将检验机器是否是指定产品
=H_设立等待(c动作名称)
comm1=createobject("mscommlib.mscomm.1")
comm1.commport=ncom口 &&//指定COM2口工作
comm1.portopen=.t. &&//打开COM2口
*//设置传输速率,奇偶校验,数据位,停止位
comm1.settings="9600,n,8,1"
indata1="" &&//变量初始化
*//从接收缓冲区读出字符串
*comm1.outsettings="9600,n,8,1"
if C密码次数="第一次"
comm1.output=CHR(27)+"I" &&第一次输入密码的控制码
else
comm1.output=CHR(27)+"E" &&第一次输入密码的控制码
endif
indata="键盘错误"
lok=.f.
for n=1 to n等待时长*2
ckey=inkey(0.5,'hm')
if ckey=27 &&ESC
=H_设立等待("用户终止本次操作,请按任意键返回")
=inkey(1,'hm')
exit
endif
comm1.inputlen=20
indata=comm1.input
if empty(indata)
loop
endif
*messagebox(indata,0,"密码")
=H_消除等待()
if len(indata)<> n密码长度+2
lok=.f.
=H_消除等待()
=H_设立等待("密码必须只能"+allt(str(n密码长度))+"位数,请按任意键返回")
inkey(0,'hm')
exit
endif
indata=allt(subst(indata,2,n密码长度))
if len(indata)=n密码长度
=H_设立等待("密码设置成功")
lok=.t.
exit
endif
endfor
if indata="键盘错误"
=H_设立等待("用户没有输入密码,请按任意键返回")
=inkey(0,'hm')
indata="密码失败"
else
if lok
=H_设立等待("读键盘密码成功")
=inkey(1,'hm')
else
=H_设立等待("读键盘密码失败,请按任意键返回")
=inkey(0,'hm')
indata="密码失败"
endif
endif
=H_消除等待()
return indata &&如果返回“密码失败”说明键盘读密码操作失败了
****************************************************
*************************************************** 两次读卡
*****************************************************
&&两次较验
proc 两次密码较验
para ncom口,c密码次数,n密码长度,n等待时长,C识别型号,c串口参数
if type("ncom口")<>"N"
ncom口=1
n密码长度=6
n等待时长=20
C识别型号="RC"
c串口参数 ="9600,n,8,1"
endif
key1="密码失败"
key1=读键盘(1,"第一次",6,20,"用户第一次输入口令,按ESC退出",)
if key1<>"密码失败"
key2=读键盘(1,"第二次",6,20,"用户第二次输入口令,按ESC退出",)
if key1==key2
=H_设立等待("两次较验密码成功")
=inkey(1,'hm')
else
key1="密码失败"
=H_设立等待("两次较验密码失败,请按任意键返回")
=inkey(0,'hm')
endif
endif
=H_消除等待()
return key1 &&返回"密码失败"
******************************************************
****************************************************** 密码加密
******************************************************
proc h_unlock
para char1,key1 && 接收两个参数: 要解密的字符串,密匙
*********************************从数据库中取密匙
char1=allt(char1)
if type("key1")<>"C"
***************************************
*备份数据库环境
noldsele=str(SELECT())
l开库=.f.
if .not. used("system")
sele 0
use system.sys
l开库=.t.
endif
sele system
key1=system.代码 &&用代码来存key
if l开库=.t.
use
endif
sele &noldsele.
***********************************
endif
***********************************************
key1=upper(allt(key1))
T_1=len(char1)
T_2=len(key1)
t_4=0
for t_n=1 to t_2 && 将 密匙 各位ASC码值相加求和
t_4=asc(subst(key1,t_n,1))
endfor
t_4=mod(t_4,256) && 求和的结果 对256求余 存入t_4
char2=""
for t_n=1 to t_1 && 每个字节都加上T_4
T_5=mod(asc(subst(char1,T_N,1))+256-t_4,256)
char2=char2+chr(t_5)
endfor
char1=""
for t_n=t_1 to 1 step -1 && 将上述得到的字符串逆序排一次
char1=char1+subst(char2,t_n,1)
endfor
char2=""
t_n=1
do while t_n <= T_1
t_m=1
t_leof=.f.
do while t_m <= T_2 && 解密的原理是,字符串按密匙的顺序,逐位+256-密匙对应位的字符
if t_n+T_M-1 > t_1 && 得值对 256 求余 将复原为原来的字符串
t_leof=.t.
exit
endif
T_3=asc(subst(char1,T_N+T_M-1,1))
T_3=T_3-asc(subst(key1,T_M,1))
T_3=mod(T_3+256,256) && 避免求余后出现负数的现象
char2=char2+chr(T_3)
t_m=t_m+1
enddo
if t_leof
exit
endif
t_n=t_N+T_2
enddo
return char2
proc h_lock
para char1,key1 && 接收两个参数: 要加密的字符串,密匙
char1=allt(char1)
*********************************从数据库中取密匙
if type("key1")<>"C"
***************************************
*备份数据库环境
noldsele=str(SELECT())
l开库=.f.
if .not. used("system")
sele 0
use system.sys
l开库=.t.
endif
sele system
key1=system.代码 &&用代码来存key
if l开库=.t.
use
endif
sele &noldsele.
***********************************
endif
***********************************************
key1=upper(allt(key1))
char2=""
T_1=len(char1) && 取要加密的字符串的长度
T_2=len(key1) && 取密匙长度
t_n=1
do while t_n <= T_1
t_m=1
t_leof=.f. && 设置加密字符串的结束标志
do while t_m <= T_2
if t_n+T_M-1 > t_1 && 加密的原理是,字符串按密匙的顺序,逐位+密匙对应位的字符
t_leof=.t. && 得值对 256 求余
exit
endif
T_3=asc(subst(char1,T_N+T_M-1,1))
T_3=T_3+asc(subst(key1,T_M,1))
T_3=mod(T_3,256)
char2=char2+chr(T_3)
t_m=t_m+1
enddo
if t_leof
exit
endif
t_n=t_n+t_2
enddo
char1=""
for t_n=t_1 to 1 step -1 && 将上述得到的字符串逆序排一次
char1=char1+subst(char2,t_n,1)
endfor
t_4=0
for t_n=1 to t_2 && 将 密匙 各位ASC码值相加求和
t_4=asc(subs(key1,t_n,1))
endfor
t_4=mod(t_4,256) && 求和的结果 对256求余 存入t_4
char2=""
for t_n=1 to t_1 && 每个字节都加上T_4
T_5=mod(asc(subst(char1,T_N,1)) + t_4,256)
char2=char2+chr(t_5)
endfor
retu char2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -