1. // CheckID_card project main.go
  2. package main
  3.  
  4. /*
  5. * ai -> a1 , a2, a3, a4, a5, a6... a17 (a18 是校验码) 身份证前17位对应(ai)
  6. * wi -> 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 (17位)
  7. *
  8. * int res = 0;
  9. * for (i = 1; i < 17; i++) {
  10. * res += (a[i] * w[i])
  11. * }
  12. * int y = res % 11;
  13. *
  14. *
  15. * y 与 a18的对应关系
  16. *
  17. * y { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  18. * 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};
  19. */
  20.  
  21. import (
  22. "fmt"
  23. "strconv"
  24. //"os"
  25. //"strings"
  26. )
  27.  
  28. func byte2int(x byte) byte {
  29. if x == {
  30. return 'X'
  31. }
  32. return (x - ) // 'X' - 48 = 40;
  33. }
  34.  
  35. func check_id(id []byte) int {
  36. arry := make([]int, )
  37.  
  38. //强制类型转换,将[]byte转换成[]int ,变化过程
  39. // []byte -> byte -> string -> int
  40. //将通过range 将[]byte转换成单个byte,再用强制类型转换string(),将byte转换成string
  41. //再通过strconv.Atoi()将string 转换成int 类型
  42. for index , value := range id {
  43. arry[index], _ = strconv.Atoi(string(value))
  44. }
  45. /*
  46. for p := 0; p < len(arry); p++ {
  47. fmt.Println("arry[", p, "]", "=", arry[p])
  48. }
  49. */
  50.  
  51. var wi []int = [...]int{, , , , , , , , , , , , , , , , }
  52. var res int
  53. for i := ; i < ; i++ {
  54. //fmt.Println("id =", i, byte2int(id[i]), wi[i])
  55. res += arry[i] * wi[i]
  56. }
  57.  
  58. //fmt.Println("res = ", res)
  59.  
  60. return (res % )
  61. }
  62.  
  63. func verify_id(verify int, id_v byte) (bool, string) {
  64. var temp byte
  65. var i int
  66. a18 := []byte{, , 'X', , , , , , , , }
  67.  
  68. for i = ; i < ; i++ {
  69. if i == verify {
  70. temp = a18[i]
  71. //fmt.Println("verify_id id",)
  72. // if a18[i] == 'X' ,let convert it to type string
  73. if (a18[i] == ) {
  74. fmt.Println("计算得到身份证最后一位是 ", string(a18[i]))
  75. } else {
  76. fmt.Println("计算得到身份证最后一位是 ", a18[i])
  77. }
  78. //fmt.Println(i, temp)
  79. break
  80. }
  81. }
  82. //if id_v == 'X', let's convert it to type string
  83. if (id_v == ) {
  84. fmt.Println("身份证最后一位是 ", string(id_v))
  85. } else {
  86. fmt.Println("身份证最后一位是 ", id_v) // id_v是身份证的最后一位
  87. }
  88.  
  89. if temp == id_v {
  90.  
  91. return true, "验证成功"
  92. }
  93.  
  94. return false, "验证失败"
  95. }
  96.  
  97. func usage() {
  98. fmt.Println("请输入要检查的身份证号码18位\n")
  99. }
  100.  
  101. func main() {
  102. var id_card []byte // 'X' == byte(88), 'X'在byte中表示为88
  103. var id_card_copy []byte
  104.  
  105. var id_card_string string
  106. fmt.Scanf("%s", &id_card_string)
  107. fmt.Println("身份证号码是 = ", id_card_string)
  108. //fmt.Println("id_card_string len = ", len(id_card_string))
  109.  
  110. if len(id_card_string) < {
  111. panic("必须要输入18位的身份证号码")
  112. }
  113.  
  114. // 将字符串,转换成[]byte,并保存到id_card[]数组当中
  115. for k, v := range []byte(id_card_string) {
  116. id_card[k] = byte(v)
  117. }
  118.  
  119. //复制id_card[18]前17位元素到id_card_copy[]数组当中
  120. for j := ; j < ; j++ {
  121. id_card_copy[j] = id_card[j]
  122.  
  123. //fmt.Println(byte2int(id_card[j]))
  124. }
  125. /*
  126. fmt.Println(byte2int(id_card[17]))
  127. fmt.Println(string(id_card[17]))
  128. */
  129. /*
  130. y := check_id(id_card_copy)
  131. fmt.Println(y)
  132. */
  133.  
  134. fmt.Println(verify_id(check_id(id_card_copy), byte2int(id_card[])))
  135. }
  136.  
  137. //测试身份证号码:34052419800101001X
  138. //测试身份证号码: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. RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)

    void Rgb2Hsv(float R, float G, float B, float& H, float& S, float&V) { // r,g,b values a ...

  2. dokcer 运行和进入容器

    <pre name="code" class="html">docker:/root# docker run -itd --name zjtest8 ...

  3. 数据结构——bitmap

    近期在看<编程珠玑>这本书. 第1章中引入了bitmap(位图)的数据结构. 曾经没有接触过, 抽出时间研究了一下,记录下来. 书中描写叙述的情景: 1. 最多1000万个7位数电话号码( ...

  4. PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具 - 开源中国社区

    PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具 - 开源中国社区 PyRedisAdmin v1.0 Beta 发布,Redis 在线管理工具

  5. ubuntu/linux mint 创建proc文件的三种方法(四)

    在做内核驱动开发的时候,能够使用/proc下的文件,获取对应的信息,以便调试. 大多数/proc下的文件是仅仅读的,但为了演示样例的完整性,都提供了写方法. 方法一:使用create_proc_ent ...

  6. 虚拟机VM10装Mac OS X 10.9.3

    近期WWDC放出终极大招--新的编程语言Swift(雨燕),导致一大波程序猿的围观和跃跃欲试.当然了,工欲善其事,必先利其器,所以对于那些没有Mac又想要尝鲜的小伙伴肯定非常为难.可是,请放心,本文教 ...

  7. hdu5172(线段树)

    传送门:GTY's gay friends 题意:判断区间[l,r]内的数字是否符合1~len(r-l+1)的一个全排列. 分析:pos[i]记录数字i出现的最大位置,pre[i]记录在位置i的数字a ...

  8. WorkFlow介绍及用法

    WorkFlow介绍及用法 说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配 ...

  9. Discount Diesel Time 9150-1 Quartz Wrist watch [WAT022]- US$4.49

    Discount Diesel Time 9150-1 Quartz Wrist watch [WAT022]- US$4.49 Diesel Time 9150-1 Quartz Wrist wat ...

  10. POJ 3652 &amp; ZOJ 2934 &amp; HDU 2721 Persistent Bits(数学 元)

    主题链接: PKU:http://poj.org/problem?id=3652 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do? probl ...