zoukankan      html  css  js  c++  java
  • 检验身份证的正确性(Golang版本)

    // CheckID_card project main.go
    package main
    
    /*
     * ai -> a1 , a2, a3, a4, a5, a6... a17 (a18 是校验码) 身份证前17位对应(ai)
     * wi -> 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 (17位)
     *
     *  int  res = 0;
     *  for (i = 1; i < 17; i++) {
     *          res += (a[i] * w[i])
     *          }
     *     int  y = res % 11;
     *
     *
     * y 与 a18的对应关系
     *
     *  y    { 0, 1,  2,  3, 4, 5, 6, 7, 8, 9, 10}
     *  a18  { 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3,  2 } -> vefiry[18] = { 1, 0, 'X', 9, 8, 7, 6, 5, 4, ,3, 2};
     */
    
    import (
        "fmt"
        "strconv"
        //"os"
        //"strings"
    )
    
    func byte2int(x byte) byte {
        if x == 88 {
            return 'X'
        }
        return (x - 48) // 'X' - 48 = 40;
    }
    
    func check_id(id [17]byte) int {
        arry := make([]int, 17)
    
        //强制类型转换,将[]byte转换成[]int ,变化过程
        // []byte -> byte -> string -> int
        //将通过range 将[]byte转换成单个byte,再用强制类型转换string(),将byte转换成string
        //再通过strconv.Atoi()将string 转换成int 类型
        for index , value := range id {
            arry[index], _ = strconv.Atoi(string(value))
        }
        /*
            for p := 0; p < len(arry); p++ {
                fmt.Println("arry[", p, "]", "=", arry[p])
            }
        */
    
        var wi [17]int = [...]int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
        var res int
        for i := 0; i < 17; i++ {
            //fmt.Println("id =", i, byte2int(id[i]), wi[i])
            res += arry[i] * wi[i]
        }
    
        //fmt.Println("res = ", res)
    
        return (res % 11)
    }
    
    func verify_id(verify int, id_v byte) (bool, string) {
        var temp byte
        var i int
        a18 := [11]byte{1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2}
    
        for i = 0; i < 11; i++ {
            if i == verify {
                temp = a18[i]
                //fmt.Println("verify_id id",)
                // if a18[i] == 'X' ,let convert it to type string
                if (a18[i] == 88 ) {
                    fmt.Println("计算得到身份证最后一位是 ", string(a18[i]))
                } else {
                fmt.Println("计算得到身份证最后一位是 ", a18[i])
                    }
                //fmt.Println(i, temp)
                break
            }
        }
        //if id_v == 'X', let's convert it to type string
        if (id_v == 88) {
        fmt.Println("身份证最后一位是 ", string(id_v))
               } else {
        fmt.Println("身份证最后一位是  ", id_v) // id_v是身份证的最后一位
               } 
    
        if temp == id_v {
    
            return true, "验证成功"
        }
    
        return false, "验证失败"
    }
    
    func usage() {
        fmt.Println("请输入要检查的身份证号码18位
    ")
    }
    
    func main() {
        var id_card [18]byte // 'X' == byte(88), 'X'在byte中表示为88
        var id_card_copy [17]byte
    
        var id_card_string string
        fmt.Scanf("%s", &id_card_string)
        fmt.Println("身份证号码是 = ", id_card_string)
        //fmt.Println("id_card_string len = ", len(id_card_string))
    
        if len(id_card_string) < 18 {
            panic("必须要输入18位的身份证号码")
        }
    
        // 将字符串,转换成[]byte,并保存到id_card[]数组当中
        for k, v := range []byte(id_card_string) {
            id_card[k] = byte(v)
        }
    
        //复制id_card[18]前17位元素到id_card_copy[]数组当中
        for j := 0; j < 17; j++ {
            id_card_copy[j] = id_card[j]
    
            //fmt.Println(byte2int(id_card[j]))
        }
        /*
            fmt.Println(byte2int(id_card[17]))
            fmt.Println(string(id_card[17]))
        */
        /*
            y := check_id(id_card_copy)
            fmt.Println(y)
        */
    
        fmt.Println(verify_id(check_id(id_card_copy), byte2int(id_card[17])))
    }
    
    //测试身份证号码:34052419800101001X
    //测试身份证号码:511028199507215915

    运行效果如下:

    代码托管于github: https://github.com/sndnvaps/CheckID_card

  • 相关阅读:
    【转】给ExtJS的Grid增加两行tbar
    AWK使用手册
    SED单行脚本快速参考(Unix 流编辑器)
    Linux的用户和用户组管理
    Linux下中文man帮助安装。
    关于TLBB 客户端UI界面修改几个定义了解
    正则表达式30分钟入门教程
    VimDiff技巧
    CentOS 更换网易源
    Mysql数据库搭建Linux
  • 原文地址:https://www.cnblogs.com/sn-dnv-aps/p/3735567.html
Copyright © 2011-2022 走看看