IMEI/MEID校驗位計算

轉自:http://blog.csdn.net/fengyifei11228/article/details/45919797



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


  1. /** 
  2.  * IMEI是國際移動通訊設備識別號(International Mobile Equipment Identity)的縮寫,用於GSM系統。 
  3.  * 由15位數字組成,前6位(TAC)是型號覈准號碼,代表手機類型。接着2位(FAC)是最後裝配號,代表產地。後6位(SNR)是串號,代表生產順序號。最後1位(SP)是檢驗碼。 
  4.  * MEID是移動通訊設備識別號(Mobile Equipment IDentifier)的縮寫,用於CDMA系統。 
  5.  * 由15位16進制數字組成,前8位是生產商編號,後6位是串號,最後1位是檢驗碼。 
  6.  * @author fengyifei11228 
  7.  * @since 2015-05-22 
  8.  */  
  9. public class DeviceUtil {  
  10.     /** 
  11.      * 格式化MEID 
  12.      * 因爲MEID格式不統一,長度有14位和16位的,所以,爲了統一,將14位和16位的MEID,統一設置爲15位的 設置格式: 
  13.      * 如果MEID長度爲14位,那麼直接得到第15位,如果MEID長度爲16位,那麼直接在根據後14位得到第15位 
  14.      * 如果MEID長度爲其他長度,那麼直接返回原值 
  15.      * @param meid 
  16.      * @return 
  17.      */  
  18.     public static String formatMeid(String meid) {  
  19.         int dxml = meid.length();  
  20.         if (dxml != 14 && dxml != 16) {  
  21.             return meid;  
  22.         }  
  23.         String meidRes = "";  
  24.         if (dxml == 14) {  
  25.             meidRes =  meid + getmeid15(meid);  
  26.         }  
  27.         if (dxml == 16) {  
  28.             meidRes = meid.substring(2) + getmeid15(meid.substring(2));  
  29.         }  
  30.         return meidRes;  
  31.     }  
  32.   
  33.     /** 
  34.      * 格式化IMEI 
  35.      * 因爲IMEI格式不統一,長度有14位和16位的,所以,爲了統一,將14位和16位的MEID,統一設置爲15位的 設置格式: 
  36.      * 如果IMEI長度爲14位,那麼直接得到第15位,如果MEID長度爲16位,那麼直接在根據前14位得到第15位 
  37.      * 如果IMEI長度爲其他長度,那麼直接返回原值 
  38.      * @param imei 
  39.      * @return 
  40.      */  
  41.     public static String formatImei(String imei) {  
  42.         int dxml = imei.length();  
  43.         if (dxml != 14 && dxml != 16) {  
  44.             return imei;  
  45.         }  
  46.         String imeiRes = "";  
  47.         if (dxml == 14) {  
  48.             imeiRes =  imei + getimei15(imei);  
  49.         }  
  50.         if (dxml == 16) {  
  51.             imeiRes =  imei + getimei15(imei.substring(0,14));  
  52.         }  
  53.         return imeiRes;  
  54.     }  
  55.     /** 
  56.      * 根據MEID的前14位,得到第15位的校驗位 
  57.      * MEID校驗碼算法: 
  58.      * (1).將偶數位數字分別乘以2,分別計算個位數和十位數之和,注意是16進制數 
  59.      * (2).將奇數位數字相加,再加上上一步算得的值 
  60.      * (3).如果得出的數個位是0則校驗位爲0,否則爲10(這裏的10是16進制)減去個位數 
  61.      * 如: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, 
  62.      *  計算奇數位數字之和和偶數位個位十位之和,得到 A+(1+E)+0+2+2+6+4+A+0+(1+4)+B+(1+8)+D+(1+C)=64  
  63.      *  校驗位 10-4 = C 
  64.      * @param meid 
  65.      * @return 
  66.      */  
  67.     private static String getmeid15(String meid) {  
  68.         if (meid.length() == 14) {  
  69.             String myStr[] = { "a""b""c""d""e""f" };  
  70.             int sum = 0;  
  71.             for (int i = 0; i < meid.length(); i++) {  
  72.                 String param = meid.substring(i, i + 1);  
  73.                 for (int j = 0; j < myStr.length; j++) {  
  74.                     if (param.equalsIgnoreCase(myStr[j])) {  
  75.                         param = "1" + String.valueOf(j);  
  76.                     }  
  77.                 }  
  78.                 if (i % 2 == 0) {  
  79.                     sum = sum + Integer.parseInt(param);  
  80.                 } else {  
  81.                     sum = sum + 2 * Integer.parseInt(param) % 16;  
  82.                     sum = sum + 2 * Integer.parseInt(param) / 16;  
  83.                 }  
  84.             }  
  85.             if (sum % 16 == 0) {  
  86.                 return "0";  
  87.             } else {  
  88.                 int result = 16 - sum % 16;  
  89.                 if (result > 9) {  
  90.                     result += 65 - 10;  
  91.                 }   
  92.                 return (char)result + "";  
  93.             }  
  94.         } else {  
  95.             return "";  
  96.         }  
  97.     }  
  98.     /** 
  99.      * 根據IMEI的前14位,得到第15位的校驗位 
  100.      * IMEI校驗碼算法: 
  101.      * (1).將偶數位數字分別乘以2,分別計算個位數和十位數之和 
  102.      * (2).將奇數位數字相加,再加上上一步算得的值 
  103.      * (3).如果得出的數個位是0則校驗位爲0,否則爲10減去個位數 
  104.      * 如: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,計算奇數位數字之和和偶數位個位十位之和, 
  105.      * 得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63  
  106.      * 校驗位 10-3 = 7 
  107.      * @param imei 
  108.      * @return 
  109.      */  
  110.     private static String getimei15(String imei){  
  111.         if (imei.length() == 14) {  
  112.             char[] imeiChar=imei.toCharArray();    
  113.             int resultInt=0;    
  114.             for (int i = 0; i < imeiChar.length; i++) {    
  115.                 int a=Integer.parseInt(String.valueOf(imeiChar[i]));    
  116.                 i++;    
  117.                 final int temp=Integer.parseInt(String.valueOf(imeiChar[i]))*2;    
  118.                 final int b=temp<10?temp:temp-9;    
  119.                 resultInt+=a+b;    
  120.             }    
  121.             resultInt%=10;    
  122.             resultInt=resultInt==0?0:10-resultInt;    
  123.             return resultInt + "";  
  124.         }else{  
  125.             return "";  
  126.         }  
  127.     }  
  128. }  
發佈了37 篇原創文章 · 獲贊 22 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章