// 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 intfor 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 bytevar i inta18 := [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 stringif (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 stringif (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位\n")
}func main() {var id_card [18]byte // 'X' == byte(88), 'X'在byte中表示为88var id_card_copy [17]bytevar id_card_string stringfmt.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

转载于:https://www.cnblogs.com/sn-dnv-aps/p/3735567.html

检验身份证的正确性(Golang版本)相关推荐

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

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

  2. EXCEL中如何提取身份证出生日期和性别信息以及检验身份证号码的正确性

    中国居民身份证号码是一组特征组合码,原为15位,现升级为18位,其编码规则为: 15位:6位数字常住户口所在县市的行政区划代码,6位数字出生日期代码,3位数字顺序码. 18位:6位数字常住户口所在县市 ...

  3. 茅台抢购脚本golang版本使用教程

    最近看到很多身边的人开始抢茅台,而且陆续都有抢到的,于是开始关注这个事情. 本来想自己看看有没有能力写一个,但是无意看到很多文章写过github上有大佬写了抢茅台脚本,于是就去GitHub上去看了看. ...

  4. 二代身份证读取 中控ID180 二三代身份证阅读器 Vue版本

    二代身份证读取 中控ID180 二三代身份证阅读器 Vue版本 设备 设备名称:台式身份证阅读机 产品型号:ID180 设备驱动和文档 链接:https://pan.baidu.com/s/1nAYk ...

  5. linux 升级golang版本,go语言如何升级版本

    go语言升级版本的方法:1.在官网下载最新的源码包:2.将源码包放在相应目录下:3.运行[sh install.sh go1.xx.linux-amd64.tar.gz]命令即可. 本文操作环境:wi ...

  6. 使用 gvm 来快速安装或者升级 golang 版本

    gvm 是 golang 的版本管理工具,有点类似于 python 的 pyenv. 一.安装 gvm bash < <(curl -s -S -L https://raw.githubu ...

  7. 在EXCEL中VBA编程检验身份证号码有效性

    *2022-12-05 改正代码中错别字,规范表述 *2022-11-30 1.增加了过程clearB()用来清除B1:Bx原有的出错说明,在过程examIdentityCard() 开头调用 2.修 ...

  8. TA416 APT使用新的Golang版本的PlugX恶意软件加载程序进行钓鱼攻击

    TA416 APT使用新的Golang版本的PlugX恶意软件加载程序,对从梵蒂冈到非洲的外交官等一系列受害者进行了鱼叉式网络钓鱼攻击. TA416高级持续威胁(APT)攻击者又回来了,在经历了一个月 ...

  9. 检验身份证号的有效性并输出有问题的号码

    摘要:一个合法的身份证号码共18位,由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9 ...

最新文章

  1. 用 CALL TRANSACTION USING... 调用批输入时的一些注意事项
  2. 【建议】如何优雅的提问?
  3. Hadoop hdfs文件块信息获取/文件重命名/修改文件的副本数量代码示例
  4. 把十进制转为二进制到16进制
  5. spring的beanutils工具类_基于spring-beans实现工具类BeanUtils基于Class实例化注入对象及查找方法、复制属性等操作...
  6. android adjust,android adjustresize adjustpan着名的问题
  7. 2018年9月5日第一贴
  8. 一条Select语句丛生到死的处理过程
  9. 计算机二级资料汇总,包含多个题库
  10. scala教程(二) 函数
  11. ACM算法设计---BFS、DFS
  12. Vue安装必要插件element-ui插件及axios依赖(详细)
  13. ios苹果应用ipa一键签名工具_win和Mac电脑端自行签名ipa教程
  14. 「 程序员的风险控制」意外险:花几十块就能让你不用担心明天和意外哪个先来
  15. Expression:vector subscript out of range
  16. win7系统怎么删除电脑运行记录?
  17. 中国计算机设计大赛来啦!用飞桨驱动智慧救援机器狗
  18. 怎么注册微信公众平台
  19. KGCN_基于知识图谱的推荐系统(KG+GCN)
  20. html5交互式地铁线路图,HTML5 SVG城市地铁路线图动画演示

热门文章

  1. 如何根据离散点自动绘制等值线(等高线)之 客观分析
  2. Python爬虫-Beautiful Soup-当当图书目录(1)
  3. int,long,long long等类型的范围
  4. JAVA数字藏品NFT平台源码(附带部署文档)
  5. 遥感建筑物提取数据集
  6. Android 获取手机所有短信
  7. 数据结构之栈,栈是很多算法的基础知识,本文带你从0开始了解栈并手写一个栈
  8. 合振动的初相位推导_②音响处理器肿么调?处理器教学 音箱延时相位耦合就是这么简单【愤怒的调音师】...
  9. 如何快速在PDF文件中插入图片
  10. 2022年流动式起重机司机考试题库模拟考试平台操作