這篇文章主要介紹如何使用Python完成15位18位身份證的互轉(zhuǎn)功能,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站制作,高端網(wǎng)頁制作,對廣告推廣等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計,網(wǎng)站優(yōu)化推廣哪家好,專業(yè)成都網(wǎng)站推廣優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。Python是一種編程語言,內(nèi)置了許多有效的工具,Python幾乎無所不能,該語言通俗易懂、容易入門、功能強大,在許多領(lǐng)域中都有廣泛的應(yīng)用,例如最熱門的大數(shù)據(jù)分析,人工智能,Web開發(fā)等。
身份證號碼的構(gòu)成
既然談到了身份證轉(zhuǎn)換,那就需要先了解下證件號碼的構(gòu)成。
公民身份號碼是特征組合碼,由 十七位數(shù)字本體碼 和 一位數(shù)字校驗碼 組成;
排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位數(shù)字校驗碼。
六位數(shù)字地址碼:表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T 2260 的規(guī)定執(zhí)行。
八位數(shù)字出生日期碼:表示編碼對象出生的年、月、日,按 GB/T 7408 的規(guī)定執(zhí)行。年、月、日代碼之間不用分隔符。某人出生日期為 1995年08月12日,其出生日期碼為 19950812。
三位順序碼:表示在同一地址碼所標(biāo)識的區(qū)域范圍內(nèi),對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
一位校驗碼:校驗碼按照 ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。
校驗碼計算方法
1、將前面的身份證號碼17位數(shù)分別乘以不同的系數(shù)。從第一位到第十七位的系數(shù)分別為: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
2、將這17位數(shù)字和系數(shù)相乘的結(jié)果相加;
3、用加出來和除以11,看余數(shù)是多少;
4、余數(shù)只可能有0 1 2 3 4 5 6 7 8 9 10這11個數(shù)字。其分別對應(yīng)的最后一位身份證的號碼為 1 0 X 9 8 7 6 5 4 3 2 ;
5、通過上面得知如果余數(shù)是2,就會在身份證的第18位數(shù)字上出現(xiàn)羅馬數(shù)字的X。
解決思路
15位轉(zhuǎn)18位:即身份證號碼的前六位數(shù)字+ '19' + 身份證第六位以后的數(shù)字 + 校驗碼
(不要問我為什么加19這種白癡(´⊙ω⊙`) @?¥&?的問題,當(dāng)然是因為只有19世紀(jì)的人才可能擁有15位的身份證號啦)
校驗碼計算方法就更簡單了,將這17位數(shù)字和系數(shù)相乘的結(jié)果相加除以11匹配余數(shù)對應(yīng)的號碼即可。
注意:代碼中我用了幾個變量,在這里拆解講解下。
Ai: 表示第i位置上的身份證號碼數(shù)字值 Wi: 表示第i位置上的加權(quán)因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
十七位數(shù)字本體碼加權(quán)求和公式: S = Sum(AiWi), i = 0, … , 16 ,先對前17位數(shù)字的權(quán)求和
計算模 Y = mod(S, 11)
通過模得到對應(yīng)的校驗碼
Y: 0 1 2 3 4 5 6 7 8 9 10
校驗碼: 1 0 X 9 8 7 6 5 4 3 2
OK,分析的差不多了,直接看代碼。
怎么用代碼實現(xiàn)?
# encoding: utf-8 """ CREATED ON 19-11-05 @AUTHOR: XUSL """ WI = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1, ] VI = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, ] DEF GET_VERITY(EIGHTEEN_CARD): """ :PARAM EIGHTEEN_CARD: :RETURN: """ AI = [] REMAINING = '' IF LEN(EIGHTEEN_CARD) == 18: EIGHTEEN_CARD = EIGHTEEN_CARD[0:-1] IF LEN(EIGHTEEN_CARD) == 17: S = 0 FOR I IN EIGHTEEN_CARD: AI.APPEND(INT(I)) FOR I IN RANGE(17): S = S + WI[I] * AI[I] REMAINING = S % 11 RETURN 'X' IF REMAINING == 2 ELSE STR(VI[REMAINING]) DEF UP_TO_EIGHTEEN(FIFTEEN_CARD): """ 15位轉(zhuǎn)18位 :PARAM FIFTEEN_CARD: :RETURN: """ EIGHTEEN_CARD = FIFTEEN_CARD[0:6] + '19' + FIFTEEN_CARD[6:15] RETURN EIGHTEEN_CARD + GET_VERITY(EIGHTEEN_CARD) DEF DOWN_TO_FIFTEEN(EIGHTEEN_CARD): """ 18位轉(zhuǎn)15位 :PARAM EIGHTEEN_CARD: :RETURN: """ RETURN EIGHTEEN_CARD[0:6] + EIGHTEEN_CARD[8:17] IF __NAME__ == '__MAIN__': # 15位轉(zhuǎn)18位 CARD_1 = UP_TO_EIGHTEEN('632123820927051') PRINT(CARD_1) # 18位轉(zhuǎn)15位 CARD_2 = DOWN_TO_FIFTEEN('410125199908222000') PRINT(CARD_2)
當(dāng)然,這只是個小功能,主要還是想分享下代碼,如果有同樣的處理可以直接用。
以上是“如何使用Python完成15位18位身份證的互轉(zhuǎn)功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。