判断IMEI或MEID是否合法

/*-----------------------------------------------
* 判断此字串所代表的IMEI或MEID是否合法
* @param imei
* @author Helin 2014-08-21 add
* @return boolen
* 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
-----------------------------------------------*/

function is_IMEI($imei=‘‘){
    if(!$imei){return false;}
    $imeiLen = strlen($imei);
    $DeOrHex = 10;//初始化,先假设此字串为IMEI::纯数字
    for($j = 0;$j < $imeiLen;$j++){
        $c = $imei[$j];
        if(is_numeric($c)){
            continue;
        }else if( ( $c >= ‘A‘ && $c <= ‘F‘ ) || ( $c >= ‘a‘ && $c <= ‘f‘ ) ){
            $DeOrHex = 16;
        }else{//如果出现数字和16进制数之外的字符,直接判断不合法
            return false;
        }
    }
    if($DeOrHex==10 && $imeiLen != 15){//全是数字(IMEI),且长度不为15
        return false;
    }
    if($DeOrHex==16){//包含合法的16进制数(MEID)
        if($imeiLen == 14){//新规定,14位MEID,直接合法,不做校验
            return true;
        }
        if($imeiLen != 14 && $imeiLen != 15){
            return false;//如果MEID长度不是14也不是15,直接判断为非法,无需校验
        }
    }
    $count = 0;
    for($i = 0;$i < 7;$i++){
        $tmp1 = hexdec($imei[$i*2]);//若为16进制字符,则转化为10进制:hexdec(‘a‘) == 10;
        $tmp2 = hexdec($imei[$i*2+1]) * 2;
        $count += $tmp1 + floor($tmp2 / $DeOrHex) + $tmp2 % $DeOrHex;
    }
    $endInt = $count % $DeOrHex;//和数的最后一位数
    $parityBit = $endInt > 0 ? $DeOrHex - $endInt : 0;//校验位
    return $parityBit == hexdec($imei[14]);
}

$imei = ‘a00000426d46cd‘;//‘863139026095804‘;
echo is_IMEI($imei)?1:0;
echo ‘<hr>‘;
时间: 2024-10-13 23:56:37

判断IMEI或MEID是否合法的相关文章

图结构练习——判断给定图是否存在合法拓扑序列

图结构练习——判断给定图是否存在合法拓扑序列 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个有向图,判断该有向图是否存在一个合法的拓扑序列. 输入 输入包含多组,每组格式如下. 第一行包含两个整数n,m,分别代表该有向图的顶点数和边数.(n<=10) 后面m行每行两个整数a b,表示从a到b有一条有向边. 输出 若给定有向图存在合法拓扑序列,则输出YES:否则输出NO. 示例输入 1 0 2 2 1 2 2 1 示例输出 YES NO #inc

图结构练习——判断给定图是否存在合法拓扑序列(sdutoj)

#include<stdio.h>#include<string.h>int d[15],map[15][15],vis[15];int main(){    int i,j,k,f,n,m,u,v;    while(~scanf("%d%d",&n,&m))    {        memset(d,0,sizeof(d));        memset(map,0,sizeof(map));        memset(vis,0,size

利用Apache的beanutils判断字符串是否为一个合法日期

依赖的jar包 commons-beanutils-1.8.0.jar commons-logging-1.0.4.jar 方法如下 package test.date; import java.util.Date; import java.util.Locale; import org.apache.commons.beanutils.locale.converters.DateLocaleConverter; /**  * 利用Apache的beanutils判断字符串是否为一个合法日期  

C# 判断一字符串是否为合法数字(正则表达式)

判断一个字符串是否为合法整数(不限制长度) public static bool IsInteger(string s) { string pattern = @"^\d*$"; return Regex.IsMatch(s,pattern); } 判断一个字符串是否为合法数字(0-32整数) public static bool IsNumber(string s) { return IsNumber(s,32,0); } 判断一个字符串是否为合法数字(指定整数位数和小数位数) //

判断一个字符串是否为合法IP

输入任意一个字符串,判断是否为合法IP 1 bool IsIPAddress(const char * str){ 2 //先判断形式是否合法, 3 4 //检查是否只包含点和数字 5 for(int i = 0; str[i] != '\0'; i++){ 6 if(!IsDigit(str[i]) && str[i] != '.') 7 return false; 8 } 9 10 //检查是否形如X.X.X.X 11 int count = 0; 12 for(int i = 0;

给定入栈顺序,判断出栈顺序是否合法

题目描述:给定一个入栈序列,给定一个出栈序列,判断该出栈序列是否合法. 分析:假如入栈序列为1 2 3 4 5,判断4 5 3 2 1 是否是合法的出栈顺序. 两个序列均以数组的形式给出 从两个数组的第一个元素开始,如果栈为空,或者,栈顶元素不等于当前出栈数组当前下标对应的元素时,将当前入栈数组中下标所指向的元素进行压栈 初始状态如下: 步骤1:把 1 进行压栈,并将下标后移,如下图所示, 步骤2:依次进行判断并压栈,当4进栈后,此时栈顶元素等于出栈数组下标所指向的元素,将4出栈,如下图所示 步

拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393

1 //拓扑排序判断是否有环 2 #include<cstdio> 3 #include<algorithm> 4 #include<string.h> 5 #include<math.h> 6 #include<queue> 7 using namespace std; 8 typedef long long ll; 9 const int maxn=1e2+10; 10 int G[maxn][maxn]; 11 int in[maxn];

SDUT OJ 2140 图结构练习——判断给定图是否存在合法拓扑序列

#include<iostream> #include<memory.h> using namespace std; int tp[11][11],visit[11]; int main() { int n,m,i,j,k,s,o,c; int flag,count,a,b; while(cin>>n>>m) { s=1; o=0; count=0; memset(tp,0,sizeof(tp)); memset(visit,0,sizeof(visit))

C语言判断文件夹名是否合法

 /*************************************************************************** * Function Name: validateFoldername * Description:  The ength of folder name should be less than 255. *                      Illegal characters are \<>()[]&:,/|?* \0