| | |
| | | |
| | | import com.dayu.baselibrary.tools.BcdUtil |
| | | import com.dayu.baselibrary.tools.HexUtil |
| | | import com.dayu.general.tool.CardCommon |
| | | import java.io.Serializable |
| | | |
| | | /** |
| | |
| | | */ |
| | | class AreaCard : BaseCard(), Serializable { |
| | | companion object { |
| | | const val CARD_TYPE = "B0" // 卡类型固定为0xB0 |
| | | const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 识别码A0 |
| | | const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 识别码B1 |
| | | const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 识别码C2 |
| | | const val IDENTIFY_CODE_89 = 0x89.toByte() // 识别码89 |
| | | const val CARD_TYPE = CardCommon.REGION_CARD // 卡类型固定为0xB0 |
| | | } |
| | | |
| | | var areaNumber: Int = 0 // 国家行政区域号(12位BCD,精确到村) |
| | | var areaNumber: String = "" // 国家行政区域号(12位BCD,精确到村) |
| | | var projectCode: Int = 0 // 项目编码(HEX 1-255) |
| | | |
| | | /** |
| | |
| | | val areaCard = AreaCard() |
| | | // 解析第0块 |
| | | val zero = data[0] |
| | | |
| | | |
| | | // 解析国家行政区域号(0-5位) |
| | | val areaCodeBytes = zero.copyOfRange(0, 6) |
| | | areaCard.areaNumber = BcdUtil.bcdToStr(areaCodeBytes).toInt() |
| | | |
| | | areaCard.areaNumber = BcdUtil.bcdToStr(areaCodeBytes) |
| | | |
| | | // 解析项目编码(6位) |
| | | areaCard.projectCode = HexUtil.get16To10LowHightByBytes(byteArrayOf(zero[6])) |
| | | |
| | | areaCard.projectCode = HexUtil.get16to10(HexUtil.byteToHex(zero[6])) |
| | | |
| | | // 验证卡类型和识别码 |
| | | if (HexUtil.byteToHex(zero[8]) != CARD_TYPE || |
| | | zero[9] != IDENTIFY_CODE_A0 || |
| | | zero[10] != IDENTIFY_CODE_B1 || |
| | | zero[11] != IDENTIFY_CODE_C2 || |
| | | zero[12] != IDENTIFY_CODE_89) { |
| | | zero[12] != IDENTIFY_CODE_89 |
| | | ) { |
| | | return null |
| | | } |
| | | |
| | |
| | | val data = ByteArray(16) |
| | | try { |
| | | // 设置国家行政区域号(BCD格式,6字节,0-5位) |
| | | val areaCodeBytes = BcdUtil.strToBcd(String.format("%012d", areaNumber)) |
| | | val areaCodeBytes = BcdUtil.strToBcd(areaNumber) |
| | | System.arraycopy(areaCodeBytes, 0, data, 0, 6) |
| | | |
| | | |
| | | // 设置项目编码(6位) |
| | | data[6] = projectCode.toByte() |
| | | |
| | | data[6] = HexUtil.hexToByte(HexUtil.get10to16(projectCode)) |
| | | |
| | | // 设置备用位(7位) |
| | | data[7] = 0x00 |
| | | |
| | | |
| | | // 设置卡类型(8位) |
| | | data[8] = HexUtil.hexToByte(CARD_TYPE) |
| | | |
| | | |
| | | // 设置识别码(9-12位) |
| | | data[9] = IDENTIFY_CODE_A0 |
| | | data[10] = IDENTIFY_CODE_B1 |
| | | data[11] = IDENTIFY_CODE_C2 |
| | | data[12] = IDENTIFY_CODE_89 |
| | | |
| | | |
| | | // 设置备用位(13-14位) |
| | | data[13] = 0x00 |
| | | data[14] = 0x00 |
| | | |
| | | |
| | | // 设置校验和(15位) |
| | | data[15] = getByteSum(data) |
| | | } catch (e: Exception) { |