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++实现了过程,最后,对于算法改进 ...
随机推荐
- Stream的去重排序
1.List<Integer>排序 List<Integer> list = new ArrayList<>();list.add(50);list.add(25) ...
- c++新特性实验(2)类型特性
1. 基本类型 1.1 增加 long long long long int signed long long signed long long int unsigned long long unsi ...
- 移动端适配(rem单位定义方法)
注:移动端必须写: <meta name="viewport" content="width=device-width, user-scalable=no, ini ...
- pc端拖拽
var move=document.getElementsByClassName("page1_2")[0]; var startX=0; var startY=0; var x= ...
- ES6学习笔记之数组的扩展
✏️1. 扩展运算符 扩展运算符(spread)是三个点(...),将一个数组转为用逗号分隔的参数序列. 普通用法 console.log(...[1,2,3]);//1 2 3 数组拷贝(普通类型深 ...
- WPF绘图性能问题
代码: /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWind ...
- rpmnew和rpmsave怎么来的
RPM spec文件有个名为 %config 的宏,它可以标识配置文件,这样在升级时用户对配置文件做过的修改就不会丢失.没有它,用户千辛万苦修改过的配置文件会在升级过程中被覆盖. %config也可以 ...
- 【同余最短路】【例题集合】洛谷P3403 跳楼机/P2371 墨墨的等式
接触到的新内容,[同余最短路]. 代码很好写,但思路不好理解. 同余最短路,并不是用同余来跑最短路,而是通过同余来构造某些状态,从而达到优化时间空间复杂度的目的.往往这些状态就是最短路中的点,可以类比 ...
- 初探Druid
说到连接池,最常见的就是dbcp和c3p0,关于druid,官方定义是为监控而生的数据库连接池. 官方中文文档地址:https://github.com/alibaba/druid/wiki/%E5% ...
- TP5.1 分页CSS样式(转载)
效果如图: 1.在extend\目录下创建page目录,在page目录中创建Page.php文件,将以下代码放入文件中 <?php namespace page; use think\Pagin ...