文档章节

IMEI号获取最后一位校验码

webphp
 webphp
发布于 2018/05/21 15:11
字数 1005
阅读 528
收藏 0

移动设备国际识别码(IMEI:International Mobile Equipment Identification Number)是区别移动设备的标志,具有唯一性,贴在手机背面的标志上,并且储存在移动设备中,可用于监控被窃或无效的移动设备,它也是该手机在厂家的"档案"和"身份证号".IMEI码由GSM(全球移动通信协会)统一分配,授权BABT(英国通信认证管理委员会)审受.其总长为15位,每位数字仅使用0~9的数字

       IMEI由15位数字组成,其组成为:

  • 1、前6位数(TAC,Type ApprovalCode)是"型号核准号码",一般代表机型.
  • 2、接着的2位数(FAC,Final Assembly Code)是"最后装配号",一般代表产地.
  • 3、之后的6位数(SNR)是"串号",一般代表生产顺序号.
  • 4、最后1位数(SP)通常是"0",为检验码,备用.

      IMEI校验码算法:

  • (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和
  • (2).将奇数位数字相加,再加上上一步算得的值
  • (3).如果得出的数个位是0则校验位为0,否则为10减去个位数

     如:35 89 01 80 69 72 41 偶数位乘以2得到5*2=10 9*2=18 1*2=02 0*2=00 9*2=18 2*2=04 1*2=02,计算奇数位数字之和和偶数位个位十位之和,得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63 => 校验位 10-3 = 7

代码如下:

/**
     * 格式化imei
     * 因为IMEI格式不统一,长度有14位和16位的,所以,为了统一,将14位和16位的MEID,统一设置为15位的 设置格式:
     * 如果IMEI长度为14位,那么直接得到第15位,如果MEID长度为16位,那么直接在根据前14位得到第15位
     * 如果IMEI长度为其他长度,那么直接返回原值
     * (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和
     * (2).将奇数位数字相加,再加上上一步算得的值
     * (3).如果得出的数个位是0则校验位为0,否则为10减去个位数
     * 如:35 89 01 80 69 72 41 偶数位乘以2得到5*2=10 9*2=18 1*2=02 0*2=00 9*2=18 2*2=04 1*2=02,
     * 计算奇数位数字之和和偶数位个位十位之和,得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63 =>
     * 校验位 10-3 = 7
     * @param imei $
     * @author Baip 125618036@qq.com
     */
    public function formatImei( $imei ){
        if ( empty( $imei ) ){
            return false;
        }
        $imeiStrlen = strlen($imei);
        if ( $imeiStrlen != 14 && $imeiStrlen != 16 ){
            return $imei;
        }
        $imeiRes = '';
        if ( $imeiStrlen == 14 ){
            $imeiRes = $imei . $this->getImei15($imei);
        }
        if ($imeiStrlen == 16) {
            $imeiRes =  $imei . $this->getImei15(substr($imei, 0,14));
        }

        return $imeiRes;
    }

    /**
     * 根据imei前14位,得到第15位的校验位
     * IMEI校验码算法:
     * (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和
     * (2).将奇数位数字相加,再加上上一步算得的值
     * (3).如果得出的数个位是0则校验位为0,否则为10减去个位数
     * 如:35 89 01 80 69 72 41 偶数位乘以2得到5*2=10 9*2=18 1*2=02 0*2=00 9*2=18 2*2=04 1*2=02,计算奇数位数字之和和偶数位个位十位之和,
     * 得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63
     * 校验位 10-3 = 7
     * @param $imei
     * @author Baip 125618036@qq.com
     */
    private function getImei15($imei){
        if ( strlen( $imei ) == 14 ){
            $imeiArr = str_split($imei);
            $imeiNewArr = [];
            foreach ($imeiArr as  $key => $value){
                $imeiNewArr[$key+1] = $value;
            }
            $sum1 = 0;
            $sum2 = 0;
            if ( is_array($imeiNewArr) && count($imeiNewArr) == 14 ){
                for ($i=1; $i<= count($imeiNewArr); $i++ ){
                    //如果为偶数
                    if ( $i % 2 == 0 ){
                        $temp = intval( ($imeiNewArr[$i] - 0) * 2 );
                        if ($temp < 10){
                            $sum2 = $sum2 + $temp;
                        }else{
                            //目的:大于10的值12,最后要用个位+十位 (1+2) 转化为:sum + 1 + 12-10
                            $sum2 = $sum2 + 1 + $temp -10 ;
                        }
                    }else{
                        $sum1  = $sum1 + $imeiNewArr[$i] - '0';
                    }
                }
                $total = $sum1 + $sum2;
                if ( $total % 10 == 0 ){
                    return 0;
                }else{
                    return intval(10 - $total % 10);
                }
            }else{
                return '';
            }
        }
    }

 

© 著作权归作者所有

共有 人打赏支持
webphp
粉丝 1
博文 92
码字总数 92338
作品 0
海淀
程序员
私信 提问
身份证号码验证算法

有时候做项目的需要对拿到的数据进行“清洗”,比如验证身份证号码是否存在。 (一)18身份证号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。 排列顺序从左至右依...

驛路梨花醉美
2016/09/13
29
0
身份证号码验证算法

做项目的时候需要对拿到的数据进行“清洗”,比如剔除一些不可能存在的身份证号码。查阅了网上的身份证号码验证算法,自己也总结一下。 (一)18身份证号码的结构  公民身份号码是特征组合码...

pmos
2016/08/05
35
0
身份证号码算法

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

一贱书生
2016/11/08
2
0
android 获取imei(国际移动设备身份码)号码详解及其应用场景

IMEI简介: IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的"电子串号",它与每台手机一一对应,而且该码是全世界唯一的...

长平狐
2012/09/03
328
0
JavaScript 18位身份证验证及身份证号码规则

18位身份证号码各位的含义 1-2位省、自治区、直辖市代码; 3-4位地级市、盟、自治州代码; 5-6位县、县级市、区代码; 7-14位出生年月日,比如19670401代表1967年4月1日; 15-17位为顺序号,...

YuanWing
2016/02/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Go Timer实现原理剖析

简介 快速使用 操作介绍

恋恋美食
19分钟前
2
0
记录一个奇怪的问题

环境:jdk1.8虚拟机参数:-verbose:gc -XX:+PrintGCDetails -Xmx20m -Xms20m -Xmn10m -XX:SurvivorRatio=8  -XX:+HeapDumpOnOutOfMemoryError 可以看出,eden占8M却放不下6M数据,发生了......

暗中观察
47分钟前
2
0
【git搭建】创建多个git账号

实习开发中我们可能一个机子上配置多个git账号,如github.com,oschina.com 或者工作账号,私人账号,这时候就2个账号用一个key,肯定会冲突,有一个会提示没权限(账号和密码对应不上) ssh ...

echojson
50分钟前
2
0
rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
今天
7
0
Android 贝塞尔曲线实践——波浪式运动

一、波浪效果如下 贝塞尔曲线自定义波浪效果的案例很多,同样方法也很简单,大多数和本案例一样使用二次贝塞尔曲线实现,同样还有一种是PathMeasure的方式,这里我们后续补充,先来看贝塞尔曲...

IamOkay
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部