博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP获取IMEI号最后一位校验码
阅读量:6119 次
发布时间:2019-06-21

本文共 3335 字,大约阅读时间需要 11 分钟。

移动设备国际识别码(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得到52=10 92=18 12=02 02=00 92=18 22=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 '';            }        }    }

转载地址:http://zamka.baihongyu.com/

你可能感兴趣的文章
js document.activeElement 获得焦点的元素
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
angularjs表达式中的HTML内容,如何不转义,直接表现为html元素
查看>>
css技巧
查看>>
Tyvj 1728 普通平衡树
查看>>
[Usaco2015 dec]Max Flow
查看>>
javascript性能优化
查看>>
多路归并排序之败者树
查看>>
java连接MySql数据库
查看>>
转:Vue keep-alive实践总结
查看>>
android studio修改新项目package名称
查看>>
深入python的set和dict
查看>>
C++ 11 lambda
查看>>