⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 读卡函数.prg

📁 通用题库组卷系统 1.本来是一个学生的本科毕业课题
💻 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 + -