| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3194 人关注过本帖
标题:关于身份证验证系统的一点奇怪的问题。
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
收藏
已结贴  问题点数:100 回复次数:96 
关于身份证验证系统的一点奇怪的问题。
我已经做好了系统的界面 初步实施验证功能
从网上搞了一些可用的身份证试了下 发现个奇怪的问题 我实在不知道怎么解决了
向各位大牛求救。看几幅图先
图片附件: 游客没有浏览图片的权限,请 登录注册

姑且不论他是否是个真人的东西,反正它通过了校验 检验码应该是对的
那我先把最后的校验位改为9 在我的程序上运行
图片附件: 游客没有浏览图片的权限,请 登录注册

可以看到第4个报错, 但是我改回X后确还是这样
图片附件: 游客没有浏览图片的权限,请 登录注册

为什么还是说第4项错误 确报校验码是X呢?

我的程序如下 有兴趣帮看下
程序代码:
Clear   All

Public gn_HalfWndHeight as Integer  && 一半窗口高度
Public gn_HalfWndWidth as Integer   && 一半窗口宽度
Public gn_Space, tb_W, tb_H as Integer  && 控件间距 及 容器里的TextBox的高度宽度参数
gn_HalfWndHeight = 290
gn_HalfWndWidth = 400
gn_Space = 20
tb_W = 300
tb_H  = 50
Public  Dsc as Character
Dsc = "" && 检验结果信息字符串
Public gn_sum && 识别校验码时用于累加和取模

Public ga_Ctnr[8] &&容器数组
ga_Ctnr[1] = CreateObject("C_Struct", "Number", "身份证号码:", tb_W , tb_H, .T., "检验")
ga_Ctnr[2] = CreateObject("C_Struct", "Province", "省(直辖市):", tb_W , tb_H, .T., "重新输入")
ga_Ctnr[3] = CreateObject("C_Struct", "Area", "地区:", tb_W , tb_H, .T., "批量检验")
ga_Ctnr[4] = CreateObject("C_Struct", "City", "市(县):", tb_W , tb_H, .T., "退出")
ga_Ctnr[5] = CreateObject("C_Struct", "Date", "出生年月日:", tb_W , tb_H, .T., "注意事项")
ga_Ctnr[6] = CreateObject("C_Struct", "Sex", "性别:", tb_W , tb_H, .T., "版本说明")
ga_Ctnr[7] = CreateObject("C_Struct", "Address", "户籍所在地:", tb_W + 100, tb_H, .F.,"33")
ga_Ctnr[8] = CreateObject("C_Struct", "Result", "检验结果:", tb_W + 200, tb_H * 2, .F.,"33")

Main()
Clear All
Return


Procedure Main()  && 主函数
           Local lo_MainForm
           lo_MainForm = NewObject("C_Form")
           lo_MainForm.show
           Read EVENTS
           Return

EndProc

Function  CheckID()  && 检验身份证号码函数
    PARAMETER Src && Src为输入的身份证号码字符串
    md11 = "0709100508040201060307091005080402"     &&与身份证前17位相对应的索引对11的模
    chk_Str ="10X98765432"              &&校验码

    Src = Alltrim(Src)    && 去掉头尾空格和0
    * 长度及出生日期的处理,仅仅接受15位和18位的身份证号码
        Do Case     

            Case  Len(Src) = 15
                Src = Left(Src, 6) + "19" + Substr(Src, 7)
            Case Len(Src) = 18
                Src = Left(Src, 17)
            Otherwise      

                Dsc_Len = "身份证的位数不正确!" + Chr(13) + "请重新输入!"
                Src = "F"
                Dsc = Dsc_Len
        EndCase

     If Src # "F"
    * 身份证前17位必须是数字
        For i = 1 to 17   

            If !IsDigit(Substr(Src, i, 1))
            Dsc_char = "1: 身份证中含有非法字符" + Chr(13)
            Else
            Dsc_char = "1(非法字符): 此项合法" + Chr(13)
            EndIf

        EndFor

    * 前两位是否在省级区划内
        If !Left(Src, 2)$"11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45," +;
                        "46,50,51,52,53,54,61,62,63,64,65,71,81,82"

            Dsc_div = "2: 身份证的所属省份非法" + Chr(13)
        Else

            Dsc_div = "2(所属省份): 此项合法" + Chr(13)
        EndIf 

    * 检验出生年月日的合法性
        If Empty(Date(Val(Substr(Src, 7, 4)), Val(Substr(Src, 11, 2)), Val(Substr(Src, 13, 2))))
            Dsc_ymd = "3: 身份证包含的日期非法" + Chr(13)
        Else

            Dsc_ymd = "3(出生日期): 此项合法" + Chr(13)
        EndIf

    * 检验最后一位校验码是否匹配
        gn_sum = 0
        For i = 1 to 17
            gn_sum = gn_sum + Val(Substr(Src, i, 1)) * Val(Substr(md11, 2 * i - 1, 2))
        EndFor

            gn_sum = Mod(gn_sum, 11)
        If Right(Src, 1) != Substr("10X98765432", gn_sum + 1, 1)
            Dsc_Chk = "4: 身份证的校验码错误,校验码应为:" + Substr("10X98765432", gn_sum + 1, 1)
        Else

            Dsc_Chk = "4(校验码): 此项合法"

        EndIf    

        Dsc = Dsc_char + Dsc_div + Dsc_ymd + Dsc_Chk
    EndIf

            Return Dsc
EndFunc


* 定义一个结构体存放和全局数组相对应的参数
Define Class C_Struct as Custom 

    ID = ""
    lbl_Caption = ""
    chg_Width = 0
    chg_Height = 0
    ask_Button = .T.   

    btn_Caption = ""
    Procedure Init(tc_ID, tc_lbl_Caption, tn_chg_Width, tn_chg_Height, tb_ask_Button, tc_btn_Caption)
        With This
            .ID = tc_ID
            .lbl_Caption = tc_lbl_Caption
            .chg_Width = tn_chg_Width
            .chg_Height = tn_chg_Height
            .ask_Button = tb_ask_Button
            .btn_Caption = tc_btn_Caption
        EndWith        

    EndProc

EndDefine


* 定义容器类 包含三个控件:Label, TextBox, CommandButton
Define Class C_Container as Container
            BorderWidth = 2
            SpecialEffect = 1

            Width = 2 * (gn_HalfWndWidth - gn_Space)

                ID = ""

           

           Add Object Ctnr_Label as Label with ;
                 Left = gn_Space,;
                 Height = 40,;
                  Width = 150
                                 

           Add Object Ctnr_Text as TextBox with ;
           Height = 50,;
            Width = 350,;
            Left = This.Ctnr_Label.Left + This.Ctnr_Label.Width + 30,;
            Top = 0         

           Add Object Ctnr_Button as CommandButton with ;
           Height = 40,;
            Width = 150,;
            Left = This.Ctnr_Text.Left + This.Ctnr_Text.Width + 10,;
            BackColor = Rgb(255, 0, 0)                      

          Procedure Init
              With This
                .Height = .Ctnr_Text.Height
                .Ctnr_Label.Top = .Ctnr_Text.Height / 2 - .Ctnr_Label.Height / 2
                .Ctnr_Button.Top = .Ctnr_Text.Height / 2 - .Ctnr_Label.Height / 2                                     
                   .SetAll("Visible", .T.)
                   .SetAll("FontSize", 16)
                   .SetAll("Alignment", 2)
                   .SetAll("FontBold", 1)                             
EndWith                                                         

    EndProc                                                                                               

EndDefine


* 定义主窗口类 在其中添加8个C_Container容器对象
Define Class C_Form as Form
    MaxButton = .F.
    Caption = "身份证号检验系统"
    AutoCenter = .T.

    ShowWindow = 2
    BorderStyle = 2

* 添加系统名标签     

       Add Object lo_Caption as Label with ;
           Top = 10,;
           Caption = "身份证号检验系统",;
        FontSize = 20,;
        AutoSize = .T. ,;
        FontName = "楷体"    


* 添加容器类对象                               

    Add Object lo_Number01 as C_Container 

    Add Object lo_Number02 as C_Container 

    Add Object lo_Number03 as C_Container 

    Add Object lo_Number04 as C_Container 

    Add Object lo_Number05 as C_Container 

    Add Object lo_Number06 as C_Container 

    Add Object lo_Number07 as C_Container 

    Add Object lo_Number08 as C_Container 




 * 初始化对系统标题标签的位置                                                                                                                                                                                                                                                                                                                                                                   

    Procedure lo_Caption.Init
           With This
                   .Left = gn_HalfWndWidth - .Width / 2

           EndWith

    EndProc

* 主窗口类初始化   

    Procedure Init
              Local chg_Top, ln_sp, ln_Top as Integer 

              chg_Top = 0

              ln_sp = 5 

        ThisForm.Top = 50
        ThisForm.Left = 50
        ThisForm.Height = 2 *gn_HalfWndHeight
        ThisForm.Width = 2 * gn_HalfWndWidth
        For i = 1 to Alen(ga_Ctnr, 1)  && 循环添加  用全局数组来赋值
              lc_Name = "lo_Number" + Padl(i, 2, '0')
              With This.&lc_Name
                      If i == 1
                      ln_Top = ThisFOrm.lo_Caption.Top + ThisForm.lo_Caption.Height + gn_Space

                      Else

                      ln_Top = ln_Top + ga_Ctnr[i - 1].chg_Height + ln_sp
                      EndIf

                      .Top = ln_Top
                      .Left = gn_Space
                      .Ctnr_Label.Caption = ga_Ctnr[i].lbl_Caption
                      .Ctnr_Button.Caption = ga_Ctnr[i].btn_Caption
                      .Ctnr_Text.Width = ga_Ctnr[i].chg_Width
                      .Ctnr_Text.Height = ga_Ctnr[i].chg_Height
                      .Height = ga_Ctnr[i].chg_Height
                      If ga_Ctnr[i].ask_Button == .F.
                          .Ctnr_Button.Visible = .F.
                      EndIf

                      If i == 8 .or. i == 1
                          .Ctnr_Text.Alignment = 0
                      EndIf

              EndWith             

        EndFor 

    EndProc

      

  * 检验按钮的点击事件处理                   

    Procedure lo_Number01.Ctnr_Button.Click
        Src = Alltrim(ThisForm.lo_Number01.Ctnr_Text.Value)
        Dsc = CheckID(Src)
        ThisForm.lo_Number08.Ctnr_Text.Value = Dsc
    EndProc


* 退出窗口                                                 

    Procedure Destroy
        Clear Events
    EndProc

EndDefine     



放一百分 求救。。。
搜索更多相关主题的帖子: color 
2012-09-24 22:10
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
   Y值:[0 1 2 3 4 5 6 7 8 9 10]  && 模值
校验码:[1 0 X 9 8 7 6 5 4 3 2 ]  && 校验码
模值对应于校验码
看了上面的结果,你应该知道为什么错了
2012-09-24 22:37
wjp456789
Rank: 5Rank: 5
来 自:四川成都
等 级:职业侠客
威 望:1
帖 子:345
专家分:330
注 册:2012-6-25
收藏
得分:0 
看不懂全代码的。。。。你还在做第一个检验功能哈。。。

我是来向高手学习的!
2012-09-24 22:48
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用bccn201203在2012-9-24 22:37:46的发言:

   Y值:[0 1 2 3 4 5 6 7 8 9 10]  && 模值
校验码:[1 0 X 9 8 7 6 5 4 3 2 ]  && 校验码
模值对应于校验码
看了上面的结果,你应该知道为什么错了

Right(Src, 1) != Substr("10X98765432", gn_sum + 1, 1)我的模值已经加一 了

后面那个校验码应该是:的提示就是根据程序验证出来的结果
我的问题是为什么计算出的校验码和给的身份证的最后一位相同的情况下还要报错 貌似我If的判断没写反吧。。。

梅尚程荀
马谭杨奚







                                                       
2012-09-24 22:57
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 3楼 wjp456789
呵呵 是啊 和乌龟爬的速度差不多啊。。。

梅尚程荀
马谭杨奚







                                                       
2012-09-24 22:57
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
回复 4楼 有容就大
先看看这篇文章,对你大有益处

http://www.
2012-09-24 23:01
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用bccn201203在2012-9-24 23:01:24的发言:

先看看这篇文章,对你大有益处

http://www.

哥哥啊 这个我反复看了好多遍 。。。
我现在的问题是 我的校验程序已经能够得出正确的校验码了 但是为什么还会报错:校验码错误。
难道是TextBox输入的时候按的ENTER键起了干扰作用 还是其他的什么旮旯有猫病。。。

梅尚程荀
马谭杨奚







                                                       
2012-09-24 23:05
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
能告诉我,最后的模值是多少
Right(Src, 1) != Substr("10X98765432", gn_sum + 1, 1)
这句是判断正确,还是错误


[ 本帖最后由 bccn201203 于 2012-9-24 23:13 编辑 ]
2012-09-24 23:12
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 8楼 bccn201203
程序代码:
 * 检验最后一位校验码是否匹配
        gn_sum = 0
        For i = 1 to 17
            gn_sum = gn_sum + Val(Substr(Src, i, 1)) * Val(Substr(md11, 2 * i - 1, 2))
        EndFor
            gn_sum = Mod(gn_sum, 11)

        If Right(Src, 1) != Substr("10X98765432", gn_sum + 1, 1)
            Dsc_Chk = "4: 身份证的校验码错误,校验码应为:" + Substr("10X98765432", gn_sum + 1, 1)
        Else
            Dsc_Chk = "4(校验码): 此项合法"
        EndIf    

是输入的身份证的最后一位和程序根据他前面的17位计算出来的校验码不相等的话 就提示 报错并给出正确的校验码
Dsc_Chk = "4: 身份证的校验码错误,校验码应为:" + Substr("10X98765432", gn_sum + 1, 1)
否则 相等 就是合法的。。。


[ 本帖最后由 有容就大 于 2012-9-24 23:19 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-09-24 23:17
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
回复 9楼 有容就大
代码没问题
Do Case     

            Case  Len(Src) = 15
                Src = Left(Src, 6) + "19" + Substr(Src, 7)
            Case Len(Src) = 18
                Src = Left(Src, 17)
            Otherwise  
   
你实际取的是第17位数字,因此是错误的。

[ 本帖最后由 bccn201203 于 2012-9-24 23:28 编辑 ]
2012-09-24 23:23
快速回复:关于身份证验证系统的一点奇怪的问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050855 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved