精华内容
下载资源
问答
  • 18位身份证标准的详细规定、校验位的计算方法18位身份证标准的详细规定、校验位的计算方法
  • SIM卡的ICCID校验位的计算方法,应该不是什么隐私或者机密吧,最近关于这个有点小发现,故写出来与大家分享一下。ICCID简介ICCID (Integerate Circuit Card Identity),集成电路卡识别码,是SIM卡的唯一识别号码。...

    SIM卡的ICCID校验位的计算方法,应该不是什么隐私或者机密吧,最近关于这个有点小发现,故写出来与大家分享一下。

    ICCID简介

    ICCID (Integerate Circuit Card Identity),集成电路卡识别码,是SIM卡的唯一识别号码。ICCID长为19~20位,其中最后一位是校验位(当然也有另外,中移动的某些卡就不是校验位,而是普通的序列号)。关于其它位的含义,可自行百度。

    背景

    最近要处理中国联通物联网卡的相关业务,需要对接联通的Jasper平台,封装成自己的一套API给客户用,查询卡的信息是通过卡的ICCID(移动、电信用的是MSISDN)。同事给过来一张联通的卡号清单,有ICCID和MSISDN,通过API查询其中一个ICCID的相关信息,结果没查到,于是通过浏览器在联通的管理平台再次查询,还是没查到,这就纳闷了!询问同事,同事说要在ICCID后面加上*,才能查询到。测试了一下,果然可以查到,只是查出的号码多了一位!

    原来,同事给我的号码清单,其中ICCID只有19位,而通过API或者管理平台,需要20位的ICCID才能查询,其中第二十位就是前面19位的校验位。

    现在问题来了:如何计算ICCID的校验位?

    第一部分:问题初探

    首先是百度,通过“iccid 校验位”关键字查询,很多人问与我同样的问题,大部分介绍的都是Luhn算法,其中知乎上有位热心的网友给出了详细的关于ICCID的介绍,以及Luhn算法的维基百科链接。进入该维基百科的页面,都是些英文,后面是各种语言的Luhn算法实现,由于目前是用PHP开发,就把PHP版本的代码复制了下来:

    function checkLuhn($number) {
        $sum = 0;
        $numDigits = strlen($number)-1;
        $parity = $numDigits % 2;
        for ($i = $numDigits; $i >= 0; $i--) {
            $digit = substr($number, $i, 1);
            if (!$parity == ($i % 2)) {$digit <<= 1;}
            $digit = ($digit > 9) ? ($digit - 9) : $digit;
            $sum += $digit;
        }
        return (0 == ($sum % 10));
    }

    由于是求校验位,显然,return那行代码不对,我们只需要求校验和除10的余数就行了。如下:

    function checkLuhn($number) {
        $sum = 0;
        $numDigits = strlen($number)-1;
        $parity = $numDigits % 2;
        for ($i = $numDigits; $i >= 0; $i--) {
            $digit = substr($number, $i, 1);
            if (!$parity == ($i % 2)) {$digit <<= 1;}
            $digit = ($digit > 9) ? ($digit - 9) : $digit;
            $sum += $digit;
        }
        return ($sum % 10);
    }

    通过同事告诉我的方法,我在联通管理后台查询到了几个ICCID的校验位,然后对比用Luhn算法的计算结果,如下:

    ICCID(中间号码用*代替) 实际校验位 Luhn算法计算的校验位
    8986***68250 3 0
    8986***68251 1 1
    8986***68252 9 2

    显然,用这个Luhn算法计算出来的校验位不对,可能的原因有二:

    • 联通用了其它的校验位计算方法
    • 联通的校验位计算方法在Luhn算法上做了改进

    对于第一种情况,一阵搜索之后,没有发现其他可能的ICCID校验位计算方法,于是我把焦点放在情况2。

    因为可以通过19位ICCID逐一查到对应的校验位,现在的问题转化为:

    已知19位ICCID及其对应的校验位,求它们之间函数关系

    第二部分: 19位ICCID与其校验位的函数关系

    收集了尾号8250~8259共10个ICCID的实际校验位与用Luhn算法计算的校验位,如下:

    ICCID(中间号码用*代替) 实际校验位 Luhn算法计算的校验位
    8986***68250 3 0
    8986***68251 1 1
    8986***68252 9 2
    8986***68253 7 3
    8986***68254 5 4
    8986***68255 2 5
    8986***68256 0 6
    8986***68257 8 7
    8986***68258 6 8
    8986***68259 4 9

    从以上表格的数据可以看出,当ICCID的第19位从0~9变化时,实际校验位呈现一种没有明显规律的变化,时大时小。不过细心察看,还是可以总结出2个规律:

    1. 实际校验位处于0~9之间,都是除10的余数,没有出现字母。对比一下Luhn算法的代码,猜想这跟前面第一部分我们讲到的Luhn算法有些关系。
    2. 相邻的校验位之间相差2(由于猜想程序的最后一步,校验位是通过除10的余数计算出来的,所以,1与9可以看作11和9,这样也是相差2)。

    为了形象一点,将ICCID第19位与校验位的关系做成图表,如下:

    这里写图片描述

    到目前为止,ICCID第19位与校验位的关系还算是有点眉目,不过ICCID所有位与校验位的关系还是没法研究。我们需要更多的数据。

    这次我把焦点放在ICCID的第18位上

    收集了尾号8260~8269共10个ICCID的实际校验位,与尾号8250~8259的对比,如下:

    ICCID(中间号码用*代替) 实际校验位 ICCID(中间号码用*代替) 实际校验位
    8986***68250 3 8986***68260 2
    8986***68251 1 8986***68261 0
    8986***68252 9 8986***68262 8
    8986***68253 7 8986***68263 6
    8986***68254 5 8986***68264 4
    8986***68255 2 8986***68265 1
    8986***68256 0 8986***68266 9
    8986***68257 8 8986***68267 7
    8986***68258 6 8986***68268 5
    8986***68259 4 8986***68269 3

    这次有重大规律了,尾号8260~8269的一系列卡号的校验位,比尾号8250~8259的校验位小1,即:

    两个ICCID,如果只有第18位数字不同,第18位数字大1,那么其校验位要小1。(仍然是基于校验位的最后一步是通过除10的余数计算出来的这个假设,所以,0与9可以看作10和9,也是相差1。)

    *如8986***682**5**0的校验位为3,而8986***682**6**0的校验位为2。

    再研究下ICCID第17位,与上面表格中的部分数据对比,如下

    ICCID(中间号码用*代替) 实际校验位 ICCID(中间号码用*代替) 实际校验位
    8986***68350 1 8986***68250 3
    8986***68351 9 8986***68251 1

    这次只有第17位不一样,校验位相差2。

    总结以上规律,以及对比Luhn算法:

    • 两个ICCID,仅第18位不一样,校验位相差1;仅第17位不一样,校验位相差2,应该是这行代码的结果:
    if (!$parity == ($i % 2)) {$digit <<= 1;}
    • 第18位数字越大,其校验位越小(相对而言,仅比较第18位为6和5的情况),这行代码

      $digit = ($digit > 9) ? ($digit - 9) : $digit;

      可改为:

      $digit = ($digit > 9) ? ($digit - 9) : (9 - $digit);

    修正后的Luhn算法如下:

    function checkLuhn($number) {
        $sum = 0;
        $numDigits = strlen($number)-1;
        $parity = $numDigits % 2;
        for ($i = $numDigits; $i >= 0; $i--) {
            $digit = substr($number, $i, 1);
            if (!$parity == ($i % 2)) {$digit <<= 1;}
            $digit = ($digit > 9) ? ($digit - 9) : (9 - $digit);
            $sum += $digit;
        }
        return $sum % 10;
    }

    用改进后的Luhn算法对尾号为8250、8260、8350的三个19位ICCID计算校验位,对比真实校验位,如下:

    ICCID(中间号码用*代替) 实际校验位 Luhn算法计算的校验位
    8986***68250 3 4
    8986***68260 2 6
    8986***68350 1 3

    没看出有什么规律,也无法比较我们自己算出的校验位与实际校验位的区别。

    考虑到我们在研究”ICCID的第19位与校验位的关系”时的发现,第19位看似有特殊规律。不妨把第19位去掉,只对前18位计算校验位试下。结果如下:

    ICCID(去掉第19位,中间号码用*代替) 实际校验位 Luhn算法计算的校验位
    8986***6825 3 2
    8986***6826 2 1
    8986***6835 1 0

    这次有明显规律了,我们的计算结果与实际结果相差1。

    为了补偿这个差别,我们只需在return那行代码前加上一句:

    $sum += 1;

    ICCID的前18位与校验位的关系差不多理清楚了,接下来处理第19位。

    由于时间比较紧,没那么多时间去研究了。我打算用表格方式来表达ICCID的第19位与校验位的关系,在PHP程序中就是用数组了,初始化一个数组:

    $arr = [
        3,1,9,7,5,2,0,8,6,4
    ];

    由于ICCID的前18位与校验位的关系已初步确定,我们猜测,19位ICCID的校验位为前18位的Luhn校验位与第19位通过某种方式计算出来的校验位相加而成,然后除10取余数,于是把对总体校验位的计算封装了这个函数:

    function checkCode($number) {
        global $arr;
        $sum = checkLuhn(substr($number, 0, 18));
        return ($sum + $arr[$number[18]])%10;
    }

    依然是对上述三个ICCID计算校验位,如下:

    ICCID(中间号码用*代替) 实际校验位 Luhn算法计算的校验位
    8986***68250 3 6
    8986***68260 2 5
    8986***68350 1 4

    现在我们的计算结果与实际相差3,我们可以把每个结果减去3,不过为了避免负数,还是加上7比较好。

    所以,checkCode这个函数可修正为:

    function checkCode($number) {
        global $arr;
        $sum = checkLuhn(substr($number, 0, 18));
        return ($sum + $arr[$number[18]] + 7)%10;
    }

    用该方法计算的校验位,附加到19位ICCID之后组成20位ICCID,对2000多个ICCID计算,然后与从联通管理后台到处的20位ICCID比较,完全吻合!说明这个算法是正确的,至少对于这2000多个ICCID是正确的。

    整合后的代码为:

    $arr = [
        3,1,9,7,5,2,0,8,6,4
    ];
    
    function checkLuhn($number) {
        $sum = 0;
        $numDigits = strlen($number)-1;
        $parity = $numDigits % 2;
        for ($i = $numDigits; $i >= 0; $i--) {
            $digit = substr($number, $i, 1);
            if (!$parity == ($i % 2)) {$digit <<= 1;}
            $digit = ($digit > 9) ? ($digit - 9) : (9 - $digit);
            $sum += $digit;
        }
        $sum += 1;
        return $sum % 10;
    }
    
    function checkCode($number) {
        global $arr;
        $sum = checkLuhn(substr($number, 0, 18));
        return ($sum + $arr[$number[18]] + 7)%10;
    }

    第三部分:再次探究ICCID校验位的计算方法

    问题是解决了。不过感觉以上代码不够优雅。

    第19位ICCID与校验位的关系

    还是看这个图:

    这里写图片描述

    由于校验位最终是通过对10取模得到的,因此我们可以对校验位加上10的倍数,也不会影响到最终结果。按照这个思路,把上图中的校验位适当加上10的整数倍,构成递增序列,画图如下:

    这里写图片描述

    从上图中,我们可以看到,ICCID第19位与扩充后的校验位成明显的线性关系。

    实际上,对数据进行归纳后发现,扩充后的校验位与ICCID第19位有如下简单的函数关系:

    x<5时,  y = 8*x + 3x>=5时, y = 8*x + 2

    这时我们可以把那个辅助数组给去掉了,用函数解析式来表达更优雅一些。

    最后,把我们的发现整合这几行代码:

    $sum += 1;

    return ($sum + $arr[$number[18]] + 7)%10;

    我们有一个比较优雅的计算方法了,称为checkLuhn2

    function checkLuhn2($number) {
        $sum = 0;
        $numDigits = strlen($number)-1;
        $numDigits -= 1;
    
        $parity = $numDigits % 2;
        for ($i = $numDigits; $i >= 0; $i--) {
            $digit = substr($number, $i, 1);
            if (!$parity == ($i % 2)) {$digit <<= 1;}
            $digit = ($digit > 9) ? ($digit - 9) : (9 - $digit);
            $sum += $digit;
        }
    
        $digit = $number[$numDigits+1];
        $sum += ($digit < 5 ? $digit*8+1 : $digit*8);
        return $sum % 10;
    }

    第四部分:总结

    目前来说,对于这2000多张卡,ICCID校验和的计算结果是OK的。如果遇到更多的卡,还需验证下,毕竟这个计算方法只是个人研究出来的(基于现有的Luhn算法)。

    对于这种没有明确处理思路的问题,关键是找准切入点,然后一步一步逼近目标。对于暂时处理不了的部分,可暂时搁置在一边,等时问题解决得差不多再来处理。

    这个算法能够研究出来,除了本人的”东拼西凑”(各种类似正交试验的数据对比,以及各种试探之外),还得幸亏联通是用了修正后的Luhn算法,不然没这么容易。

    展开全文
  • 18位身份证校验位的计算方法 18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中...

    18位身份证校验位的计算方法

    18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。
        GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实
    施之日起代替GB11643-1989。
        GB11643-1999《公民身份号码》主要内容如下:
        一、范围
        该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
        二、编码对象
        公民身份号码的编码对象是具有中华人民共和国国籍的公民。
        三、号码的结构和表示形式
        1、号码的结构
        公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
        2、地址码
        表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
        3、出生日期码
        表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
        4、顺序码
        表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
        5、校验码
        (1)十七位数字本体码加权求和公式
        S = Ai * Wi, i = 2, ... , 18
        Y = mod(S, 11)
        i: 表示号码字符从右至左包括校验码字符在内的位置序号
        Ai:表示第i位置上的身份证号码字符值
        Wi:表示第i位置上的加权因子
        i: 18 17 16 15 14 13 12 11 10 9 8 7  6 5 4 3 2 1
        Wi: 7  9 10  5  8  4  2  1  6 3 7 9 10 5 8 4 2 1
        (2)校验码字符值的计算
        Y:      0 1 2 3 4 5 6 7 8 9 10
        校验码: 1 0 X 9 8 7 6 5 4 3  2
        四、举例如下:
        北京市朝阳区:  11010519491231002X
        广东省汕头市:  440524188001010014 

    --验证15位 及18位 身份证号码的位数、出生年月日是否正确,可以纠正大部分的输入错误。

    -- Access 不支持 Substring 查询,可以替换为 mid 查询。

    select 序号,姓名,身份证号,性别
    from 身份表
    where (len(身份证号)<>15 and len(身份证号)<>18)
    or (len(身份证号)=15 and ((Substring(身份证号,9,2)>12)
    or (Substring(身份证号,11,2) > 31)
    or (Substring(身份证号,9,2) in (01,03,05,07,08,10,12) and Substring(身份证号,11,2)>31)
    or (Substring(身份证号,9,2) in (04,06,09,11) and Substring(身份证号,11,2)>30)
    or (Substring(身份证号,9,2)=02 and Substring(身份证号,11,2)>29)))

    or (len(身份证号)=18 and (Substring(身份证号,7,2)<'19' or Substring(身份证号,7,2)>'20'
            or (Substring(身份证号,11,2)>12)
    or (Substring(身份证号,11,2) in (01,03,05,07,08,10,12) and Substring(身份证号,13,2)>31)
    or (Substring(身份证号,11,2) in (04,06,09,11) and Substring(身份证号,13,2)>30)
    or (Substring(身份证号,11,2)=02 and Substring(身份证号,13,2)>29)))


    ---------------------- 下面是针对 15位 及18位 身份证号码性别的验证语句 ------------------

    -- Access 不支持 Substring 查询,可以替换为 mid 查询。

    select 序号,姓名,身份证号,性别
    from 身份表
    where (((len(身份证号)=15) and (Substring(身份证号,15,1) in (1,3,5,7,9)) and 性别<>'男')
    or ((len(身份证号)=15) and (Substring(身份证号,15,1) in (2,4,6,8,0)) and 性别<>'女'))

    or (((len(身份证号)=18) and (Substring(身份证号,17,1) in (1,3,5,7,9)) and 性别<>'男')
    or ((len(身份证号)=18) and (Substring(身份证号,17,1) in (2,4,6,8,0)) and 性别<>'女'))

     


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2009/03/25/4025157.aspx

    展开全文
  • EAN码校验位的计算方法

    千次阅读 2005-11-14 18:08:00
    /** EAN码校验位的计算方法 从代码位置序号2开始,所有偶数位的数字代码求和为a。 将上步中的a乘以3为a。 从代码位置序号3开始,所有奇数位的数字代码求和为b。 将a和b相加为c。 取c的个位数d。 用10减去d即为校验位...

    /**
       EAN码校验位的计算方法
       从代码位置序号2开始,所有偶数位的数字代码求和为a。
       将上步中的a乘以3为a。
       从代码位置序号3开始,所有奇数位的数字代码求和为b。
       将a和b相加为c。
       取c的个位数d。
       用10减去d即为校验位数值。

       例:234235654652的校验码的计算如下表:

       数据码 校验码
       代码位置序号 13 12 11 10 9 8 7 6 5 4 3 2 1
       数字码 2 3 4 2 3 5 5 5 4 6 5 2 ?
       偶数位     3 + 2 + 5 + 5 + 6 + 2
       奇数位 2 + 4 + 3 + 5 + 4 + 5

       步骤1:3+2+5+5+6+2=23
       步骤2:23*3=69
       步骤3:2+4+3+5+4+5=23
       步骤4:69+23=92
       步骤5:10-2=8
       步骤6:校验码为 8


       数据码 校验码
       代码位置序号 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
       数字码 2 0 0 0 0 0 5 0 0 2 2 0 0 0 1 4 7 ?
       偶数位 2 + 0 + 0 + 5 + 0 + 2 + 0 + 1 + 7
       奇数位      0 + 0 + 0 + 0 + 2 + 0 + 0 + 4

       步骤1:2+0+0+5+0+2+0+1+7=17
       步骤2:17*3=51
       步骤3:0+0+0+0+2+0+0+4=6
       步骤4:51+6=57
       步骤5:10-7=3
       步骤6:校验码为 3

      */ 
      

    /// <summary>
      /// EAN码校验位的计算
      /// </summary>
      /// <param name="szCode"></param>
      /// <returns></returns>
      private bool GetVerifyBit(ref string szCode)
      {
       int nNum1 = 0;
       int nNum2 = 0;
       int nNum3 = 0;
       int szLen = 0; 
       if ( szCode == null )
        return false;
       
       szLen = szCode.Length;    
       if(szLen <=12 || szLen >= 17)
            return true;
       for ( int i=0; i<szLen; i++)
       {   

        if ( i%2 == 0 )
        {
         nNum2 += int.Parse(szCode[i].ToString()); //偶数     
        }
        else
        {
         nNum1 += int.Parse(szCode[i].ToString()); //奇数     
        }
       }
       nNum3 = (Operator.DiscountLabelBarLength % 2 ==0) ? nNum1 + nNum2 * 3 : nNum1 * 3 + nNum2 ; 
       
       int t ;
       if(nNum3%10>0) t= 10- (nNum3 % 10) ;
       else t=0;
       szCode+=t;

       return true
      }

        

    /// <summary>
      /// EAN码校验位的计算
      /// </summary>
      /// <param name="szCode"></param>
      /// <returns></returns>
      private bool GetVerifyBit(ref string szCode)
      {
       int nNum1 = 0;
       int nNum2 = 0;
       int nNum3 = 0;
       int szLen = 0; 
       if ( szCode == null )
        return false;
       
       szLen = szCode.Length;    
       if(szLen <=12 || szLen >= 17)
            return true;
       for ( int i=0; i<szLen; i++)
       {   

        if ( i%2 == 0 )
        {
         nNum2 += int.Parse(szCode[i].ToString()); //偶数     
        }
        else
        {
         nNum1 += int.Parse(szCode[i].ToString()); //奇数     
        }
       }
       nNum3 = (Operator.DiscountLabelBarLength % 2 ==0) ? nNum1 + nNum2 * 3 : nNum1 * 3 + nNum2 ; 
       
       int t ;
       if(nNum3%10>0) t= 10- (nNum3 % 10) ;
       else t=0;
       szCode+=t;

       return true
      }

        

        

    如果再精简些应该直接用数组类型来实现,这样就不用使用string了.代码中的细节部分不是效率最高写法.盖于本人学历尚浅,对char等类型掌握的还不熟.所以就用一堆的转型来解决了.

    代码用c#写成,相信学java人士也能看懂吧 呵呵

    前几天上传得代码有问题居然没人发现,汗,还是自己改过来吧...现在已经改完了,不知道会不会有其他得问题了,欢迎批评啊

    展开全文
  • 一、身份证号码结构 公民身份号码是特征组合码,由十七数字本体码和一位校验码组成。排列顺序从左至右依次为:六数字地址码,八位数字出生日期码,三数字顺序码和一数字校验码。  1、顺序码 表示在同一...

    一、身份证号码的结构
          公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

      1、顺序码
        表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
       2、校验码与其算法
        (1)十七位数字本体码加权求和公式
            S = Ai * Wi, i = 2, ... , 18
            Y = mod(S, 11)
            i: 表示号码字符从右至左包括校验码字符在内的位置序号
           Ai:表示第i位置上的身份证号码字符值
            Wi:表示第i位置上的加权因子
            i: 18 17 16 15 14 13 12 11 10 9 8 7  6 5 4 3 2 1
           Wi: 7  9 10  5  8  4  2  1  6 3 7 9 10 5 8 4 2 1
       (2)校验码字符值的计算
           Y:      0 1 2 3 4 5 6 7 8 9 10
           校验码: 1 0 X 9 8 7 6 5 4 3  2

    二、js实现

    /**
     * 从18位/17位身份证号算出校验位
     * @param idCardNO
     * @return string
     */

         function BASE_getCheckDigit18( idCardNO){
        //权重值
        var VERIFY18RIGHTS = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
        var VERIFY18_CHECKDIGIT = "10X98765432";
        var sum = 0;
        for(var i = 0; i <= 16; i++){
            sum += parseInt(idCardNO.charAt(i)) * VERIFY18RIGHTS[i];
        }
        //对权重值取模
        return VERIFY18_CHECKDIGIT.charAt(sum % 11);
    }
    三、类似问题

        编码在出版业的应用,给定日期算出星期几 取七为模mod(7)

     

    展开全文
  • 第二代身份证号码第十八位数字的计算方法为: 一. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 二. 将这17位数字和系数相乘的结果...
  • 第二代身份证号码第十八位数字的计算方法为: 一. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 二. 将这17位数字和系数相乘的结果...
  • 本函数提供18位身份证校验位的计算方法,输入前17位即可得到第18位的校验码!
  • EAN校验的计算方法

    千次阅读 2017-12-26 16:39:29
     EAN码校验位的计算方法   从代码位置序号2开始,所有偶数位的数字代码求和为a。   将上步中的a乘以3为a。   从代码位置序号3开始,所有奇数位的数字代码求和为b。   将a和b相加为c。   取c的个位数d。 ...
  • ISBN 10位校验的计算方法

    千次阅读 2013-10-22 16:42:24
    国际标准书号...10位计算方法如下: 1、假设某国际标准书号号码前9是:7-309-04547; 2、计算加权和:; 3、计算余数:; 4、计算 差: 如果,校验码是字母“X”;如果,校验码是数字“0
  • 18身份证号码最后一位校验的计算方法 公民身份号码是一系列组合码,由十七数字本体码和一位校验码组成。排列顺序从左至右依次为:六数字地址码,八位数字出生日期码,三数字顺序码和一数字校验码。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 768
精华内容 307
关键字:

校验位的计算方法