IMEI校验思路及代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<pre>
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
</pre>
<!--35 89 01 80 69 72 41 7-->
<input type="text" value='358901806972417' />
<button onclick="check()">校验</button><br />
<p>批量生成IMEI</p>
数量:<input type="text" id="num" value="1" />
<button onclick="generate()">生成</button>
<div id="box"></div> <script type="text/javascript">
var oInput = document.getElementsByTagName("input")[0];
function check(){
var val = oInput.value;
if(val && val.length == 15){
// var res = checkNum(sumIMEI(val.slice(0,14)), val.slice(-1));
var res = checkNum(calLastNum(sumIMEI(val.slice(0,14))),val.slice(-1))
console.log("校验结果", res);
return res;
}else{
console.log("长度有误");
return false;
}
} function doubleNum (n){
if(n === undefined || n === null){
return "";
}
n = String(n);
if(n.length > 2){
return n
}else{
n = "0" + n;
return n.slice(-2);
}
} function sumIMEI(str){ // 传入IMEI的前14位
var res = 0, tempNum, tempStr;
for(let i = 0, len = str.length; i < len; i++){
if(i % 2 == 0){ // 奇数位
res += Number(str[i]);
} else { // 偶数位
tempNum = Number(str[i]) * 2;
tempStr = doubleNum(tempNum);
res += Number(tempStr[0]) + Number(tempStr[1]);
}
}
console.log(res);
return res;
} function checkNum(rightTestNum, t){ // 校验位校验 num:sumIMEI的结果,t:IMEI的最后一位校验位 console.log("正确的校验位", rightTestNum);
if(rightTestNum == t){
return true;
}else{
return false;
}
} function calLastNum(num){
var temp = String(num);
var rightTestNum;
console.log(temp.slice(-1));
var lastNum = Number(temp.slice(-1)); if(lastNum){ // 末位不为0,用 10-末位
rightTestNum = 10 - lastNum;
}else{ // 末位为0,返回0
rightTestNum = lastNum;
}
return rightTestNum;
} function generate(){
var arr = [];
var count = Number(document.getElementById("num").value);
if(!count){
return arr;
} for(let i = 0; i <count; i++){
var str = String(Math.random()).slice(-14);
var num = sumIMEI(str);
var lastNum = calLastNum(num);
arr.push(str + lastNum);
}
console.log(arr);
var oDiv = document.getElementById("box");
oDiv.innerHTML = "";
arr.forEach(item => {
oDiv.innerHTML += "<p>" + item + "</p>";
}) return arr;
}
</script>
</body>
</html>
IMEI校验思路及代码的更多相关文章
- [技术栈]C#利用Luhn算法(模10算法)对IMEI校验
1.Luhn算法(模10算法) 通过查看ISO/IEC 7812-1:2017文件可以看到对于luhn算法的解释,如下图: 算法主要分为三步: 第一步:从右边第一位(最低位)开始隔位乘2: 第二步:把 ...
- ASP.NET 大文件下载的实现思路及代码
文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果.本文就基于ASP.NET提供大文件下载的实现思路及代 ...
- 【转】Android自定义Adapter的ListView的思路及代码
原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 在开发中,我们经常使 ...
- HTML5绘制矩形和圆形并且还有获取在这个图层内的坐标的思路和代码 - feilong_12的专栏 - 博客频道 - CSDN.NET
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- 用Java实现断点续传的基本思路和代码
用Java实现断点续传的基本思路和代码 URL url = new URL(http://www.oschina.net/no-exist.zip); HttpURLConnection http ...
- Py-解决粘包现象,tcp实现并发,tcp实现传输文件的程序,校验思路,线程与进程
黏包现象 TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方TCP接收到 ...
- 1.Two Sum(c++)(附6ms O(n) accepted 思路和代码)
问题描述: Given an array of integers, return indices of the two numbers such that they add up to a speci ...
- java 26 - 6 网络编程之 TCP协议 传输思路 以及 代码
TCP传输 Socket和ServerSocket 建立客户端和服务器 建立连接后,通过Socket中的IO流进行数据的传输 关闭socket 同样,客户端与服务器是两个独立的应用程序 TCP协议发送 ...
- n皇后2种解题思路与代码-Java与C++实现
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了n皇后问题的解题思路,并分别用java和c++实现了过程,最后,对于算法改进 ...
随机推荐
- Leetcode401Binary Watch二进制手表
二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59). 每个 LED 代表一个 0 或 1,最低位在右侧. 给定一个非负整数 n 代表当前 LED 亮着 ...
- 【转载】TSN简介及相关资源
原文:https://blog.csdn.net/u012692537/article/details/86188392 一.简介 1.1 什么是TSN TSN(Time Sensitive Netw ...
- 《2018年云上挖矿态势分析报告》发布,非Web类应用安全风险需重点关注
近日,阿里云安全团队发布了<2018年云上挖矿分析报告>.该报告以阿里云2018年的攻防数据为基础,对恶意挖矿态势进行了分析,并为个人和企业提出了合理的安全防护建议. 报告指出,尽管加密货 ...
- 记一次PHP 数组基本用法
以前不知道PHP数组可以这样叠加. $b = array( '2' => 'zhang', ); $a = array( ' => 'li' ) + $b; print_r($a); $b ...
- zoj 1001 python起步
/*赶角还是挺好的....*/ import sys for line in sys.stdin: a=line.split() print int(a[0])+int(a[1])
- R语言中如何使用最小二乘法
R语言中如何使用最小二乘法 这里只是介绍下R语言中如何使用最小二乘法解决一次函数的线性回归问题. 代码如下: > x<-c(6.19,2.51,7.29,7.01,5.7, ...
- 外观模式(Facade)(门面模式、子系统容易使用)
外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式.该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低 ...
- Oracle删除当前用户下所有的表的方法1
1.如果有plsql客户端,则可以使用该用户登录,选中所有表 右键Drop即可. 2.如果有删除用户的权限,则可以: ? 1 drop user user_name cascade; 加了cascad ...
- Leetcode63.Unique Paths II不同路径2
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...
- 简单的layui二级联动
用layui实现省市二级联动, 需要注意的是使用layui之后, 你看到的下拉选框就不是option了,而是一些div 1.select表单 2.JS, ajax返回的是普通的数组