文档章节

IMEI/MEID校验位计算

Adairs
 Adairs
发布于 2015/05/23 21:34
字数 1455
阅读 353
收藏 0

IMEI是国际移动通讯设备识别号(International Mobile Equipment Identity)的缩写,用于GSM系统。

由15位数字组成,前6位(TAC)是型号核准号码,代表手机类型。接着2位(FAC)是最后装配号,代表产地。后6位(SNR)是串号,代表生产顺序号。最后1位(SP)是检验码。


MEID是移动通讯设备识别号(Mobile Equipment IDentifier)的缩写,用于CDMA系统。

由15位16进制数字组成(一般使用前14位),前8位是生产商编号,后6位是串号,最后1位是检验码。


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

MEID校验码算法:
(1).将偶数位数字分别乘以2,分别计算个位数和十位数之和,注意是16进制数
(2).将奇数位数字相加,再加上上一步算得的值
(3).如果得出的数个位是0则校验位为0,否则为10(这里的10是16进制)减去个位数
如:AF 01 23 45 0A BC DE 偶数位乘以2得到F*2=1E 1*2=02 3*2=06 5*2=0A A*2=14 C*2=18 E*2=1C,计算奇数位数字之和和偶数位个位十位之和,得到 A+(1+E)+0+2+2+6+4+A+0+(1+4)+B+(1+8)+D+(1+C)=64 => 校验位 10-4 = C

/**
 * IMEI是国际移动通讯设备识别号(International Mobile Equipment Identity)的缩写,用于GSM系统。
 * 由15位数字组成,前6位(TAC)是型号核准号码,代表手机类型。接着2位(FAC)是最后装配号,代表产地。后6位(SNR)是串号,代表生产顺序号。最后1位(SP)是检验码。
 * MEID是移动通讯设备识别号(Mobile Equipment IDentifier)的缩写,用于CDMA系统。
 * 由15位16进制数字组成,前8位是生产商编号,后6位是串号,最后1位是检验码。
 * @author adairs
 * @since 2015-05-22
 */
public class DeviceUtil {
	/**
	 * 格式化MEID
	 * 因为MEID格式不统一,长度有14位和16位的,所以,为了统一,将14位和16位的MEID,统一设置为15位的 设置格式:
	 * 如果MEID长度为14位,那么直接得到第15位,如果MEID长度为16位,那么直接在根据后14位得到第15位
	 * 如果MEID长度为其他长度,那么直接返回原值
	 * @param meid
	 * @return
	 */
	public static String formatMeid(String meid) {
		int dxml = meid.length();
		if (dxml != 14 && dxml != 16) {
			return meid;
		}
		String meidRes = "";
		if (dxml == 14) {
			meidRes =  meid + getmeid15(meid);
		}
		if (dxml == 16) {
			meidRes = meid.substring(2) + getmeid15(meid.substring(2));
		}
		return meidRes;
	}

	/**
	 * 格式化IMEI
	 * 因为IMEI格式不统一,长度有14位和16位的,所以,为了统一,将14位和16位的MEID,统一设置为15位的 设置格式:
	 * 如果IMEI长度为14位,那么直接得到第15位,如果MEID长度为16位,那么直接在根据前14位得到第15位
	 * 如果IMEI长度为其他长度,那么直接返回原值
	 * @param imei
	 * @return
	 */
	public static String formatImei(String imei) {
		int dxml = imei.length();
		if (dxml != 14 && dxml != 16) {
			return imei;
		}
		String imeiRes = "";
		if (dxml == 14) {
			imeiRes =  imei + getimei15(imei);
		}
		if (dxml == 16) {
			imeiRes =  imei + getimei15(imei.substring(0,14));
		}
		return imeiRes;
	}
	/**
	 * 根据MEID的前14位,得到第15位的校验位
	 * MEID校验码算法:
	 * (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和,注意是16进制数
	 * (2).将奇数位数字相加,再加上上一步算得的值
	 * (3).如果得出的数个位是0则校验位为0,否则为10(这里的10是16进制)减去个位数
	 * 如:AF 01 23 45 0A BC DE 偶数位乘以2得到F*2=1E 1*2=02 3*2=06 5*2=0A A*2=14 C*2=18 E*2=1C,
	 * 	计算奇数位数字之和和偶数位个位十位之和,得到 A+(1+E)+0+2+2+6+4+A+0+(1+4)+B+(1+8)+D+(1+C)=64 
	 *  校验位 10-4 = C
	 * @param meid
	 * @return
	 */
	private static String getmeid15(String meid) {
		if (meid.length() == 14) {
			String myStr[] = { "a", "b", "c", "d", "e", "f" };
			int sum = 0;
			for (int i = 0; i < meid.length(); i++) {
				String param = meid.substring(i, i + 1);
				for (int j = 0; j < myStr.length; j++) {
					if (param.equalsIgnoreCase(myStr[j])) {
						param = "1" + String.valueOf(j);
					}
				}
				if (i % 2 == 0) {
					sum = sum + Integer.parseInt(param);
				} else {
					sum = sum + 2 * Integer.parseInt(param) % 16;
					sum = sum + 2 * Integer.parseInt(param) / 16;
				}
			}
			if (sum % 16 == 0) {
				return "0";
			} else {
				int result = 16 - sum % 16;
				if (result > 9) {
					result += 65 - 10;
				} 
				return result + "";
			}
		} else {
			return "";
		}
	}
	/**
	 * 根据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
	 * @return
	 */
	private static String getimei15(String imei){
		if (imei.length() == 14) {
			char[] imeiChar=imei.toCharArray();  
	        int resultInt=0;  
	        for (int i = 0; i < imeiChar.length; i++) {  
	            int a=Integer.parseInt(String.valueOf(imeiChar[i]));  
	            i++;  
	            final int temp=Integer.parseInt(String.valueOf(imeiChar[i]))*2;  
	            final int b=temp<10?temp:temp-9;  
	            resultInt+=a+b;  
	        }  
	        resultInt%=10;  
	        resultInt=resultInt==0?0:10-resultInt;  
	        return resultInt + "";
		}else{
			return "";
		}
	}
}




© 著作权归作者所有

Adairs
粉丝 3
博文 125
码字总数 93362
作品 0
长宁
技术主管
私信 提问
为什么有的app获取的imei是imei1,有的是meid?

我们的app获取imei是用:telephonyManager.getDeviceId() 来获取的 在对接陌陌做转化测试的时候,发现陌陌获取imei是拿的imei1,但是我们拿的是meid,导致同一个手机不同应用获取的imei不一致...

hisune
2018/04/09
745
0
TelephonyManager类

TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。 在应用程序中可以使用这些get方法获取相...

骑牛找牛
2014/02/03
167
1
关于android读取用户号码,手机串号,SIM卡序列号

1.从一个错误代码引出我们的讨论: android公开的API提供了访问方法,大家都知道使用TelephonyManager提供的方法,但是有些理解有误,如下国内一个比较大的andorid论坛提供的例子,就出现了错...

迷途d书童
2012/03/26
1K
2
Android 解析imei

Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId(); 在manifest.xml文件中要添加 import android.app.Activity; import android.os.Bundle; import android.......

长平狐
2012/08/14
68
0
Android 解析imei

Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId(); 在manifest.xml文件中要添加 import android.app.Activity; import android.os.Bundle; import android.......

长平狐
2012/08/09
155
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
今天
6
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
今天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
今天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
今天
18
0
浅谈java过滤器Filter

一、简介 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml...

青衣霓裳
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部