Scala自定义MEID效验工具类

import java.util.regex.Pattern
import java.util.zip.CRC32

object MeidUtils {
  /**
    * 将字符串转换成为Int类型
    * @param s str
    * @return  Int
    */
  def parseInt(s:String):Int={
    try {
      s.isEmpty match {
        case true => 0
        case 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.length
    if (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 = 0
      for (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 % 16
          sum = sum + 2 * param.toInt / 16
        }
      }

      if (sum % 16 == 0) {
        "0"
      }
      else {
        var result = 16 - sum % 16
        if (result > 9) {
          result += 65 - 10
        }
        result + ""
      }
    }
    else {
      ""
    }
  }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

訾零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值