当前位置: 首页 > 后端技术 > PHP

PHP获取IMEI号末位校验码

时间:2023-03-29 16:57:22 PHP

国际移动设备识别码(IMEI:InternationalMobileEquipmentIdentificationNumber)是区分移动设备的标志。它是独一无二的。它贴在手机背面的标牌上,存储在移动设备中。它可用于监控被盗或无效的移动设备,也是手机在厂家的“档案”和“身份证号”。IMEI码由GSM(全球移动通信协会)统一分配,BABT(英国通信认证管理委员会)授权。它的总长度为15位,每一位只使用0到9的数字。IMEI由15位组成,分别由:1、前6位(TAC,TypeApprovalCode)为“型号核准号”,一般表示模型。2、接下来的2位数字(FAC,FinalAssemblyCode)为“总装编号”,一般代表产地。3、接下来的6位数字(SNR)是“序号”,一般代表生产序号。4、最后一位(SP)通常为“0”,为校验码,保留。IMEI校验码算法:(1).将偶数位乘以2,分别计算个位和十位的和(2)。除以奇数位Add,加上上一步(3)计算的值。如果得到的位数为0,则校验位为0,否则为10减个位数,如:35890180697241偶数位乘以2得到52=1092=1812=0202=0092=1822=041*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代码如下:/***formatimei*由于IMEI格式不统一,长度有14位和16位,所以为了统一,14位和16位MEID,统一设置为15位设置格式:*如果IMEI长度为14位,则直接获取第15位,如果MEID长度为16位,则直接根据前14位获取第15位*如果IMEI长度为其他长度,则直接返回原始值*(1)。将偶数位乘以2,计算个位和十位之和*(2)。将奇数位相加加上上一步得到值*(3)。如果得到的位数为0,则校验位为0,否则为10减个位数*例如:35890180697241偶数位乘以2得5*2=109*2=181*2=020*2=009*2=182*2=041*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*@paramimei$*@authorbaip125618036@qq.com*/publicfunctionformatImei($imei){if(empty($imei)){returnfalse;}$imeiStrlen=strlen($imei);如果($imeiStrlen!=14&&$imeiStrlen!=16){返回$imei;}$imeiRes='';如果($imeiStrlen==14){$imeiRes=$imei.$this->getImei15($imei);}if($imeiStrlen==16){$imeiRes=$imei.$this->getImei15(substr($imei,0,14));}返回$imeiRes;/***根据imei前14位,得到第15位校验位*IMEI校验码算法:*(1).偶数乘法用2计算个位和十位的和*(2)。添加奇数位并添加在上一步*(3)中计算的值。如果结果位为0,则正确校验位为0,否则为10减个位*例如:35890180697241偶数位乘以2得到5*2=109*2=181*2=020*2=009*2=182*2=041*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*@authorBaip125618036@qq.com*/privatefunctiongetImei15($imei){if(strlen($imei)==14){$imeiArr=str_split($imei);$imeiNewArr=[];foreach($imeiArras$key=>$value){$imeiNewArr[$key+1]=$value;}$sum1=0;$sum2=0;if(is_array($imeiNewArr)&&count($imeiNewArr)==14){for($i=1;$i<=count($imeiNewArr);$i++){//即使($i%2==0){$temp=intval(($imeiNewArr[$i]-0)*2);如果($temp<10){$sum2=$sum2+$temp;}else{//目的:大于10的值为12,最后用个位+十位(1+2)转化为:求和+1+12-10$sum2=$sum2+1+$temp-10;}}else{$sum1=$sum1+$imeiNewArr[$i]-'0';}}$总计=$sum1+$sum2;如果($total%10==0){返回0;}else{returnintval(10-$total%10);}}else{返回'';}}}