检验身份证的正确性(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 k, v := range id {
arry[k], _ = strconv.Atoi(string(v))
}
/*
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位\n")
}

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

检验身份证的正确性(Golang版本),布布扣,bubuko.com

时间: 2024-10-12 16:59:49

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

18位身份证的编码规则是: 前1、2位数字表示:所在省(直辖市、自治区)的代码 第3、4位数字表示:所在地级市(自治州)的代码 第5、6位数字表示:所在区(县、自治县、县级市)的代码; 第7—14位数字表示:出生年、月、日; 第15、16位数字表示:所在地的派出所的代码; 第17位数字表示性别:奇数表示男性,偶数表示女性; 第18位数字是校检码,用来检验身份证的正确性。 用户在输入身份证的过程中经

System.in是输入的意思.Scanner s = new Scanner(System.in);是新建一个扫描器,扫描你输入的内容.s.nextInt()是扫描到的你输入的int类型的值.int x是将扫描到的你输入的int类型的值赋到x上. import java.util.Scanner;public class Main{ public static void findid(String s1){ String s=s1.replace(" ","");

上传golang 版本SDK

在上传的时候,文件都上传成功了,但是返回的信息里面errcode 404 token 是"".是不是因为我的callbackUrl(随便写的) 写错导致的. 上传golang 版本SDK >> golang 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/golang/1010000008901091/上传golang版本SDK.html

C#验证身份证号码正确性

原文:C#验证身份证号码正确性 18位号码: 1 private static bool CheckIDCard18(string Id) 2 { 3 long n = 0; 4 if (long.TryParse(Id.Remove(17), out n) == false || n < Math.Pow(10, 16) || long.TryParse(Id.Replace('x', '0').Replace('X', '0'), out n) == false) 5 { 6 return

微信用户加密数据解密 -golang版本

背景 因为小程序先前端获取的用户数据的openId和UnionId属于用户隐私数据,需要进行对用户加密数据进行解密才能获取,官方提供的有解密demo有php,python,C++等语言版本的,但是没有golang版本,所以今天写下博客,写下golang版的解密. 加密数据解密算法 接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据.开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行

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

身份证前两位各省对应的编号是: 1.华北地区:北京市|11,天津市|12,河北省|13,山西省|14,内蒙古自治区|15: 2.东北地区: 辽宁省|21,吉林省|22,黑龙江省|23: 3.华东地区: 上海市|31,江苏省|32,浙江省|33,安徽省|34,福建省|35,江西省|36,山东省|37: 4.华中地区: 河南省|41,湖北省|42,湖南省|43: 5.华南地区:广东省|44,广西壮族自治区|45,海南省|46: 6.西南地区: 四川省|51,贵州省|52,云南省|53,西藏自治区|5

js检验身份证

<%@ page language="java" pageEncoding="GBK"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>从身份证号码中获取出生日期</title> <link href="CSS/style.css"

[原创] linux 下上传 datapoint数据到yeelink 【golang版本】同时上传2个数据点

/* Create by sndnvaps<[email protected]> * data: 2015-04-12* upload 2 datapoint to yeelink.net at the same time * post by sndnvaps * hold on https://github.com/sndnvaps/MyRasPi*/ //upload_client.go import ( "fmt" "io/ioutil" &quo

php验证身份证号码正确性

/** * 验证身份证号 * @param $vStr * @return bool */ function isCreditNo($vStr) { $vCity = array( '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',

[原创] linux 下上传 datapoint数据到yeelink 【golang版本】

package main /* Create by sndnvaps<[email protected]> * date : 2015-04-05 * upload datapoint to yeelink.net * origin post by sndnvaps * hold on https://github.com/sndnvaps/MyRasPi */ import ( "fmt" "io/ioutil" "net" &qu