// 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 == {
return 'X'
}
return (x - ) // 'X' - 48 = 40;
} func check_id(id []byte) int {
arry := make([]int, ) //强制类型转换,将[]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 []int = [...]int{, , , , , , , , , , , , , , , , }
var res int
for i := ; i < ; i++ {
//fmt.Println("id =", i, byte2int(id[i]), wi[i])
res += arry[i] * wi[i]
} //fmt.Println("res = ", res) return (res % )
} func verify_id(verify int, id_v byte) (bool, string) {
var temp byte
var i int
a18 := []byte{, , 'X', , , , , , , , } for i = ; i < ; 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] == ) {
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 == ) {
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位\n")
} func main() {
var id_card []byte // 'X' == byte(88), 'X'在byte中表示为88
var id_card_copy []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) < {
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 := ; j < ; 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[])))
} //测试身份证号码:34052419800101001X
//测试身份证号码:511028199507215915

运行效果如下:

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

检验身份证的正确性(Golang版本)的更多相关文章

  1. 检验身份证的正确性(C语言版本)

    /* check id_card * write by sndnvaps<sndnvaps@gmail.com> * ai -> a1 , a2, a3, a4, a5, a6... ...

  2. php验证身份证号码正确性

    发布:JB01   来源:脚本学堂     [大 中 小] 分享一例php代码,用于验证身份证号码的正确性,用到了preg_match.preg_replace函数,有需要的朋友可以参考学习下.本文转 ...

  3. 上传golang 版本SDK

    在上传的时候,文件都上传成功了,但是返回的信息里面errcode 404 token 是"".是不是因为我的callbackUrl(随便写的) 写错导致的. 上传golang 版本 ...

  4. Golang版本的rocksdb-对gorocksdb的封装

    rocksdb的优秀特性不用多说,但是它是用c++语言写的,就是这一个特点就把很多人拦住了.虽然rocksdb官方也有Java版本,但是Golang的发展速度让人不容小觑,而且由于golang原生对高 ...

  5. Oracle 检验身份证是否正确的存储过程

    ) ) ); ); ); ); ); ); ); ; , , , , , , , , , , , , , , , , , ); ;  , ) );  ..  loop )) ) ); , )), ), ...

  6. Golang 版本发布 与 TIOBE 排名

    2016年国庆节(10月1日)开始接触 Go 语言,记录一下它的 版本发布 与 TIOBE 排名: Golang 排行榜 月份 版本 排名 备注 2012.03 1.0             201 ...

  7. golang 版本升降之后报错——imports runtime: C source files not allowed when not using cgo or SWIG

    问题: golang 升级或者降级版本之后,执行编译报错如下: package github.com/onsi/ginkgo/ginkgo imports runtime: C source file ...

  8. 【C#】身份证号正确性验证及正则表达式格式验证

    身份证前两位各省对应的编号是: 1.华北地区:北京市|11,天津市|12,河北省|13,山西省|14,内蒙古自治区|15: 2.东北地区: 辽宁省|21,吉林省|22,黑龙江省|23: 3.华东地区: ...

  9. javascript 判断身份证的正确性

    function isIdCardNo(vals) { var cardNum = vals; if (cardNum.length == 0) { return true; } // 11-15,2 ...

随机推荐

  1. NET Core 中的依赖注入

    NET Core 中的依赖注入 [共7篇] 一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制, ...

  2. CSDN编程挑战——《高斯公式》

    高斯公式 题目详情: 高斯在上小学时发明了等差数列求和公式:1+2+..+100=5050.如今问题在于给你一个正整数n,问你他能够表示为多少种连续正整数之和?(自身也算). 输入格式: 多组数据,每 ...

  3. IE与FF脚本兼容性问题

    (1) window.event: 表示当前的事件对象,IE有这个对象,FF没有,FF通过给事件处理函数传递事件对象 (2) 获取事件源 IE用srcElement获取事件源,而FF用target获取 ...

  4. thinkphp中URL传参数的几种方式

    在thinkphp中,url传参合asp.net中原理类似,下面就单个参数和多个参数传递方式进行一个简单讲解 1.传单个参数 单个参数这种比较简单,例如 想像edit操作里面传递一个id值,如下写法_ ...

  5. syslog-ng 3.4.3 发布,强烈建议升级 - 开源中国社区

    syslog-ng 3.4.3 发布,强烈建议升级 - 开源中国社区 syslog-ng 3.4.3 发布,强烈建议升级    oschina 发布于: 2013年08月16日 (2评)    分享到 ...

  6. WebService的相关使用

    近期公司项目使用WebService ,这里简单做个总结. 事实上详细使用细节有些情况下须要改,还须要看实际情况,须要与server联调,详细沟通. 比方公司连接,非要把envelope.dotNet ...

  7. 【VBA研究】查找目录以下全部文件的名称

    作者:iamlaosong 目录里面保存有面单扫描的图像文件,文件名称为邮件号码.如今想收集这些邮件号码,由于量非常大,不可能一个一个的截取,仅仅能通过程序实现.假定,当前工作表B列里放的是存放这些图 ...

  8. 基于Opencv图像处理的时时头像採集试验

    2014 4.20 近期想做一个关于图像处理的软件玩玩,可惜也没有什么特别的想法,就当玩玩好了,准备用Opencv开源库实现下简单的功能吧. Opencv是一个专业的图像处理库,里面有非常多基础函数能 ...

  9. 快速入门github的方法

    Sometimes you just need a little help. ps:官方的帮助,原汁原味的帮助!强烈推荐 https://help.github.com/ Pro Git Book C ...

  10. 怎样使用docker不加sudo

    有时候发现docker有的指令必须加sudo才干运行,通过下面三步设置便可不加sudo直接运行docker指令: 1. 假设还没有docker group就加入一个: sudo groupadd do ...