Java IMEI串号生成规则

本文详细介绍了IMEI码的组成结构,包括TAC、FAC、SNR和CD等部分的具体含义,并提供了IMEI码校验算法及生成示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IMEI码由15-17位数字组成。

第一部分 TAC,Type Allocation Code,类型分配码,由8位数字组成(早期是6位),是区分手机品牌和型号的编码,该代码由GSMA及其授权机构分配。其中TAC码前两位又是分配机构标识(Reporting Body Identifier),是授权IMEI码分配机构的代码,如01为美国CTIA,35为英国BABT,86为中国TAF。

第二部分 FAC,Final Assembly Code,最终装配地代码,由2位数字构成,仅在早期TAC码为6位的手机中存在,所以TAC和FAC码合计一共8位数字。FAC码用于生产商内部区分生产地代码。

第三部分 SNR,Serial Number,序列号,由第9位开始的6位数字组成,区分每部手机的生产序列号。

第四部分 CD,Check Digit,验证码,由前14位数字通过Luhn算法计算得出。

第五部分 SVN,Software Version Number,软件版本号,区分同型号手机出厂时使用的不同软件版本,仅在部分品牌的部分机型中存在。

转自:https://www.cnblogs.com/bohr/p/7093392.html 随机生成IMEI码


	private static String getIMEI() {// calculator IMEI
        int r1 = 1000000 + new java.util.Random().nextInt(9000000);
        int r2 = 1000000 + new java.util.Random().nextInt(9000000);
        String input = r1 + "" + r2;
        char[] ch = input.toCharArray();
        int a = 0, b = 0;
        for (int i = 0; i < ch.length; i++) {
            int tt = Integer.parseInt(ch[i] + "");
            if (i % 2 == 0) {
                a = a + tt;
            } else {
                int temp = tt * 2;
                b = b + temp / 10 + temp % 10;
            }
        }
        int last = (a + b) % 10;
        if (last == 0) {
            last = 0;
        } else {
            last = 10 - last;
        }
        return input + last;
    }

转自:https://hsx9566.iteye.com/blog/1498214

/** 
 * imei由15位数字组成, 
 * 前6位(TAC)是型号核准号码,代表手机类型。 
 * 接着2位(FAC)是最后装配号,代表产地。 
 * 后6位(SNR)是串号,代表生产顺序号。 
 * 最后1位 (SP)是检验码。  
 *  
 * 检验码计算: 
 * (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和 
 * (2).将奇数位数字相加,再加上上一步算得的值 
 * (3).如果得出的数个位是0则校验位为0,否则为10减去个位数 
 *  
 * @author sonzer 
 *  
 */  
public class MakeImei {  
    public static void main(String[] args) {  
        String imeiString="35566778898256";//前14位  
        char[] imeiChar=imeiString.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;  
        System.out.println("imei:"+imeiString+resultInt);  
    }  
}  

转自:https://blog.youkuaiyun.com/zengxx1989/article/details/49889921

package com.test.main;
 
import java.util.ArrayList;
import java.util.List;
 
public class IMEIGen {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String code = "35254112521400";
		String newCode = genCode(code);
		System.out.println("======"+newCode);
		System.out.println(code+newCode);
		String endCode = "35254112521500";
		beachIMEI(code,endCode);
	}
	
	/**
	 * 批量生成IMEI
	 * @param begin 
	 * @param end
	 * @return
	 */
	static List<String> beachIMEI(String begin,String end){
		List<String> imeis = new ArrayList<String>();
		try {
			long count = Long.parseLong(end) - Long.parseLong(begin);
			Long currentCode = Long.parseLong(begin);
			String code ;
			for (int i = 0; i <= count; i++) {
				code = currentCode.toString();
				code =code+ genCode(code);
				imeis .add(code);
				System.out.println("code====="+code);
				currentCode += 1;			
			}
		} catch (Exception e) {
			e.printStackTrace();
		}	
		
		return imeis;
	}
	
	/**
	 * IMEI 校验码
	 * @param code
	 * @return
	 */
	public static String genCode(String code){
		int total=0,sum1=0,sum2 =0;
		int temp=0;
		char [] chs = code.toCharArray();
		for (int i = 0; i < chs.length; i++) {			
			int num = chs[i] - '0'; 	// ascii to num
			//System.out.println(num);
			/*(1)将奇数位数字相加(从1开始计数)*/
			if (i%2==0) {
				sum1 = sum1 + num;
			}else{
				/*(2)将偶数位数字分别乘以2,分别计算个位数和十位数之和(从1开始计数)*/
				temp=num * 2 ;
				if (temp < 10) {
					sum2=sum2+temp;
				}else{
					sum2 = sum2 + temp + 1 -10;
				}
			}
		}
		total = sum1+sum2;
		/*如果得出的数个位是0则校验位为0,否则为10减去个位数 */
		if (total % 10 ==0) {
			return "0";
		}else{
			return (10 - (total %10))+"";
		}
		
	}
 
}

转自:https://blog.youkuaiyun.com/hebbers/article/details/78729213

/// <summary>
        /// IMEI校验
        /// </summary>
        /// <param name="imei">IMEI</param>
        /// <returns></returns>
        private bool IMEICheck(string imei)
        {
            int sum1 = 0, sum2 = 0, temp = 0, total = 0, lastNum = 0;
            for (int i = 0; i < 14; i++)
            {
                if ((i % 2) == 0)
                {//奇数位
                    sum1 = sum1 + int.Parse(imei[i].ToString());
                }
                else
                {//偶数位
                    temp = (int.Parse(imei[i].ToString())) * 2;
                    if (temp < 10)
                    {
                        sum2 = sum2 + temp;
                    }
                    else
                    {
                        sum2 = sum2 + 1 + temp - 10;
                    }
                }  
            }
            total = sum1 + sum2;
            //获取个位数
            if ((total % 10) == 0)
            {
                lastNum = 0;
            }
            else
            {
                lastNum = total % 10;
            }
 
            //校验
            if ((10 - lastNum) != int.Parse(imei[14].ToString()))
                return false;
            else
                return true;
        }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值