import java.util.regex.Pattern
import java.util.zip.CRC32object MeidUtils {/*** 将字符串转换成为Int类型* @param s str* @return  Int*/def parseInt(s:String):Int={try {s.isEmpty match {case true => 0case false => s.toInt}} catch {case _:Exception => 0}}/*** 将字符串转换成为Double类型* @param s  str* @return  double*/def parseDouble(s:String):Double={try {if (StringUtils.isNotEmpty(s)) {s.toDouble} else {0.0}} catch {case _:Exception => 0.0}}/*** 判断是否全部是数字* @param str* @return boolean*/private def isAllNumber(str: String) = Pattern.compile("[0-9]*").matcher(str).matches()/*** 判断是否含有数字* @param str* @return boolean*/private def isContainNumber(str: String) = Pattern.compile("[0-9]*").matcher(str).find()/*** 判断是否仅由字母和数字组成,包括全是字母以及全是数字* @param str* @return boolean*/private def isAllLetAndNum(str: String) = Pattern.compile("[a-zA-Z0-9]*").matcher(str).matches()/*** 判断是否全部是字母* @param str* @return boolean*/private def isAllLet(str: String) = Pattern.compile("[a-zA-Z]+").matcher(str).matches()/*** 判断是否含有字母* @param str* @return boolean*/private def isContainLet(str: String) = Pattern.compile("[a-zA-Z]+").matcher(str).find()/*** 判断是十六进制* @param str* @return boolean*/private def isHexadecimal(str: String) = Pattern.compile("[a-fA-F0-9]*").matcher(str).matches()/*** 将imei格式化成标准的imei* @param imei* @return*/def formatIMEID(imei: String): String = {var imeiId = ""val imeiNum = if (Utils.isAllNumber(imei) && (imei.length == 15 || imei.length == 14)) imei else ""if (imeiNum.length == 14) {imeiId = imeiNum + getMeid15(imei)} else if (imeiNum.length == 15) {imeiId = imeiNum}val IMEILet = if (Utils.isContainLet(imei) && (imei.length == 15 || imei.length == 14)) imei else ""if (IMEILet.length == 14) {imeiId = formatMeid(IMEILet).toUpperCase} else if (IMEILet.length == 15) {imeiId = IMEILet}imeiId}/*** 格式化MEID* 因为MEID格式不统一,长度有14位和16位的,所以,为了统一,将14位和16位的MEID,统一设置为15位的 设置格式:* 如果MEID长度为14位,那么直接得到第15位,如果MEID长度为16位,那么直接在根据后14位得到第15位* 如果MEID长度为其他长度,那么直接返回原值** @param meid* @return*/private def formatMeid(meid: String): String = {val dxml: Int = meid.lengthif (dxml != 14 && dxml != 16) {return meid}var meidRes: String = ""if (dxml == 14 && isHexadecimal(meid)) {meidRes = meid + getMeid15(meid)} else {meidRes = meid}if (dxml == 16) {meidRes = meid.substring(2) + getMeid15(meid.substring(2))}meidRes}/*** 根据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 def getMeid15(meid: String): String = {if (meid.length == 14) {val myStr = Array("a", "b", "c", "d", "e", "f")var sum = 0for (i <- 0 to meid.length - 1) {var param = meid.substring(i, i + 1)for (j <- myStr.indices) {if (param.equalsIgnoreCase(myStr(j))) {param = "1" + String.valueOf(j)}}if (i % 2 == 0) {sum = sum + param.toInt}else {sum = sum + 2 * param.toInt % 16sum = sum + 2 * param.toInt / 16}}if (sum % 16 == 0) {"0"}else {var result = 16 - sum % 16if (result > 9) {result += 65 - 10}result + ""}}else {""}}
}

Scala自定义MEID效验工具类相关推荐

  1. 自定义Quartz超实用工具类

    自定义Quartz超实用工具类 1.添加maven依赖 <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz - ...

  2. android自定义线程池工具类,妈妈再也不用担心你不会使用线程池了(ThreadUtils)...

    为什么要用线程池 使用线程池管理线程有如下优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的可 ...

  3. Android开发实战《手机安全卫士》——2.“设置中心”模块实现 自定义组件 Sp工具类 MD5加密

    文章目录 1.home界面布局 2.自定义获取焦点的TextView 3.自定义控件回顾 4.九宫格使用 5.设置中心--条目布局结构 6.设置中心--自定义组合控件构成布局结构 7.设置中心--自定 ...

  4. 自定义一个SharedPreferences工具类

    这是一个操作SharedPreferences的工具类,封装了对sharedPreferences的操作. public class SharedpreferencesUtil {//SharedPr ...

  5. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  6. 弄清std::chrono::system_clock::time_point,自定义时间工具类

    time_t 是32位的整数,用来存放格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,不能表示毫秒,约能表示135年 time ...

  7. dbutils java_Dbutils工具类的使用

    一.什么是Dbutils? Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能.来源百度百科 ...

  8. Android实战简易教程-第五十枪(工具类的测试)

    在开发中,为了提高开发效率,我们一般会自定义自己的工具类.为了保证项目的可靠性,在将工具类引入项目之前,我们一般都会对工具类进行单元测试,下面我们通过一个实例看一下如何搭建测试环境. 1.首先自定义一 ...

  9. Springboot集成Redis和Redis工具类

    目录 1.导入依赖 2.修改配置文件 3.测试 4.使用redis存入对象 5.redis自定义封装 RedisUtils工具类 1.导入依赖 <dependency><groupI ...

最新文章

  1. 我应该在CSS中使用px或rem值单位吗?
  2. Oracle数据库的显示提交与隐式提交,针对oracle工具的自动提交机制
  3. 7.10.7740.16
  4. boost::hana::make_lazy用法的测试程序
  5. Java 集合之自动打包和解包以及泛型
  6. 换了电脑如何使用hexo继续写博客
  7. 工作25:工具里面代码提交
  8. 标签插入两一个html,一个类下有很多a标签,给第二个a标签添加样式,怎么写才能不用再给第二个a添加类_html/css_WEB-ITnose...
  9. 国家开放大学2021春1040公司概论题目
  10. 17. meta http-equiv 属性
  11. springboot集成quartz完成定时任务
  12. 史上超强图像处理开源工具包--ImageMagick
  13. VisualStudio2017编写masm32汇编程序以及语法高亮配置
  14. 智源首席科学家孙茂松当选欧洲科学院外籍院士
  15. Kafka概述(二)进阶知识
  16. 西门子_Step7软件仿真方法
  17. 什么是基本表?什么是视图?两者的联系和区别是什么?视图有哪些优点?
  18. python关联通达信pywin32_[AHK]联动通达信其实很简单
  19. android 自动获取短信验证码
  20. 力扣刷题——扑克牌中的顺子

热门文章

  1. stm32F103C8T6控制DHT11
  2. 变速器档位速比的matlab仿真
  3. JS原生获取class对象(getElementsByClassName)
  4. Android 超简单音乐播放器(九)搜索网络歌曲,获得热门榜单(GridView)(易源api的使用)(JSON的解析)(刷新)
  5. Spring详解(超全面)
  6. java-php-python-springboot线上教学平台计算机毕业设计
  7. 学Python太枯燥?不多BB这几个有趣的python 库让你爱上python
  8. 【黑马程序员pink老师前端】网页相关概念
  9. 怎样查询今天是属于一年中的第几周?ww和iw 的周别问题。
  10. 常见的数据埋点方式介绍