|  |  |  | 
|---|
|  |  |  | package com.dayu.henanlibrary.card; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import android.text.TextUtils; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.dayu.baselibrary.tools.BcdUtil; | 
|---|
|  |  |  | import com.dayu.baselibrary.tools.HexUtil; | 
|---|
|  |  |  | import com.dayu.henanlibrary.utils.MyCommon; | 
|---|
|  |  |  | import com.dayu.henanlibrary.utils.CardCommon; | 
|---|
|  |  |  | import com.tencent.bugly.crashreport.CrashReport; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.io.Serializable; | 
|---|
|  |  |  | 
|---|
|  |  |  | public class DomainCard implements Serializable { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public String cardType = MyCommon.DOMAIN_CARD_TYPE;//卡类型 | 
|---|
|  |  |  | public String cardType = CardCommon.DOMAIN_CARD_TYPE;//卡类型 | 
|---|
|  |  |  | public String domainNumber;//域名序号 (BCD格式) | 
|---|
|  |  |  | public int domainLength;//域名长度 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //端口号为5个字节,不足5位高位补0。端口号与域名之间用”,”隔开。端口号最后以”#”结束 | 
|---|
|  |  |  | public String domainName;//域名 | 
|---|
|  |  |  | public int port;//端口 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public int type;//域名卡新乡C1后有01==0,鹿邑没有01==1 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public int getType() { | 
|---|
|  |  |  | return type; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void setType(int type) { | 
|---|
|  |  |  | this.type = type; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public String getDomainName() { | 
|---|
|  |  |  | return domainName; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static DomainCard toBean(List<byte[]> data) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | DomainCard domainCard = new DomainCard(); | 
|---|
|  |  |  | DomainCard domainXinXiangCard = new DomainCard(); | 
|---|
|  |  |  | String domainNumber = BcdUtil.bcdToStr(data.get(0)[1]); | 
|---|
|  |  |  | domainCard.domainNumber = domainNumber; | 
|---|
|  |  |  | int domainLength = HexUtil.get16to10(HexUtil.byteToHex(data.get(0)[2])); | 
|---|
|  |  |  | byte[] domainData = new byte[domainLength + 7]; | 
|---|
|  |  |  | int index = 0; | 
|---|
|  |  |  | for (int i = 0; i < 3; i++) { | 
|---|
|  |  |  | int jIndex; | 
|---|
|  |  |  | if (i == 0) { | 
|---|
|  |  |  | jIndex = 3; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | jIndex = 0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (int j = jIndex; j < 15; j++) { | 
|---|
|  |  |  | if (index < domainData.length) { | 
|---|
|  |  |  | domainData[index] = data.get(i)[j]; | 
|---|
|  |  |  | index++; | 
|---|
|  |  |  | if ("00".equals(domainNumber)||"01".equals(domainNumber)||"02".equals(domainNumber)){//假如序号小于等于2就认为是新乡的 | 
|---|
|  |  |  | domainXinXiangCard.setType(0); | 
|---|
|  |  |  | domainXinXiangCard.domainNumber = domainNumber; | 
|---|
|  |  |  | int domainLength = HexUtil.get16to10(HexUtil.byteToHex(data.get(0)[2])); | 
|---|
|  |  |  | byte[] domainData = new byte[domainLength + 7]; | 
|---|
|  |  |  | int index = 0; | 
|---|
|  |  |  | for (int i = 0; i < 3; i++) { | 
|---|
|  |  |  | int jIndex; | 
|---|
|  |  |  | if (i == 0) { | 
|---|
|  |  |  | jIndex = 3; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | jIndex = 0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (int j = jIndex; j < 15; j++) { | 
|---|
|  |  |  | if (index < domainData.length) { | 
|---|
|  |  |  | domainData[index] = data.get(i)[j]; | 
|---|
|  |  |  | index++; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String domainStr = new String(domainData, StandardCharsets.US_ASCII); | 
|---|
|  |  |  | if (!TextUtils.isEmpty(domainStr)){ | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | String[] parts = domainStr.split("#")[0].split(","); | 
|---|
|  |  |  | if (parts.length >= 2) { | 
|---|
|  |  |  | String domainName = parts[0]; | 
|---|
|  |  |  | String port = parts[1].replace("#", ""); | 
|---|
|  |  |  | domainXinXiangCard.setDomainName(domainName); | 
|---|
|  |  |  | domainXinXiangCard.setPort(Integer.valueOf(port)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (NumberFormatException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | domainXinXiangCard.setType(1); | 
|---|
|  |  |  | int domainLength = HexUtil.get16to10(HexUtil.byteToHex(data.get(0)[1])); | 
|---|
|  |  |  | byte[] domainData = new byte[domainLength + 7]; | 
|---|
|  |  |  | int index = 0; | 
|---|
|  |  |  | for (int i = 0; i < 3; i++) { | 
|---|
|  |  |  | int jIndex; | 
|---|
|  |  |  | if (i == 0) { | 
|---|
|  |  |  | jIndex = 2; | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | jIndex = 0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | for (int j = jIndex; j < 15; j++) { | 
|---|
|  |  |  | if (index < domainData.length) { | 
|---|
|  |  |  | domainData[index] = data.get(i)[j]; | 
|---|
|  |  |  | index++; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String domainStr = new String(domainData, StandardCharsets.US_ASCII); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!TextUtils.isEmpty(domainStr)){ | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | String[] parts = domainStr.split("#")[0].split(","); | 
|---|
|  |  |  | if (parts.length >= 2) { | 
|---|
|  |  |  | String domainName = parts[0]; | 
|---|
|  |  |  | String port = parts[1].replace("#", ""); | 
|---|
|  |  |  | domainXinXiangCard.setDomainName(domainName); | 
|---|
|  |  |  | domainXinXiangCard.setPort(Integer.valueOf(port)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } catch (NumberFormatException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String domainStr = new String(domainData, StandardCharsets.US_ASCII); | 
|---|
|  |  |  | String domainName = domainStr.split(",")[0]; | 
|---|
|  |  |  | String port = domainStr.split(",")[1].replace("#", ""); | 
|---|
|  |  |  | domainCard.setDomainName(domainName); | 
|---|
|  |  |  | domainCard.setPort(Integer.valueOf(port)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return domainCard; | 
|---|
|  |  |  | return domainXinXiangCard; | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | CrashReport.postCatchedException(e); | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 用户卡0块 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public class Zero extends BaseCard { | 
|---|
|  |  |  | public class Zero extends HNBaseCard { | 
|---|
|  |  |  | public byte[] toByte() { | 
|---|
|  |  |  | byte[] data = new byte[16]; | 
|---|
|  |  |  | data[0] = HexUtil.hexToByte(cardType); | 
|---|
|  |  |  | if (domainNumber != null) { | 
|---|
|  |  |  | byte[] domainNumbers = BcdUtil.strToBcd(domainNumber); | 
|---|
|  |  |  | data[1] = domainNumbers[0]; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | domainLength = domainName.length(); | 
|---|
|  |  |  | data[2] = HexUtil.hexToByte(HexUtil.get10to16(domainLength)); | 
|---|
|  |  |  | String portStr = String.valueOf(port); | 
|---|
|  |  |  | int lenght = portStr.length(); | 
|---|
|  |  |  | for (int i = 0; i < 5 - lenght; i++) { | 
|---|
|  |  |  | portStr = "0" + portStr; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String ascii = IDN.toASCII(domainName + "," + portStr + "#"); | 
|---|
|  |  |  | asciiByte = ascii.getBytes(); | 
|---|
|  |  |  | if (asciiByte.length < 12) { | 
|---|
|  |  |  | System.arraycopy(asciiByte, 0, data, 3, asciiByte.length); | 
|---|
|  |  |  | //            域名卡新乡C1后有01==0,鹿邑没有01==1 | 
|---|
|  |  |  | if (type == 0) { | 
|---|
|  |  |  | if (domainNumber != null) { | 
|---|
|  |  |  | byte[] domainNumbers = BcdUtil.strToBcd(domainNumber); | 
|---|
|  |  |  | data[1] = domainNumbers[0]; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | data[2] = HexUtil.hexToByte(HexUtil.get10to16(domainLength)); | 
|---|
|  |  |  | String portStr = String.valueOf(port); | 
|---|
|  |  |  | int lenght = portStr.length(); | 
|---|
|  |  |  | for (int i = 0; i < 5 - lenght; i++) { | 
|---|
|  |  |  | portStr = "0" + portStr; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String ascii = IDN.toASCII(domainName + "," + portStr + "#"); | 
|---|
|  |  |  | asciiByte = ascii.getBytes(); | 
|---|
|  |  |  | System.arraycopy(asciiByte, 0, data, 3, Math.min(asciiByte.length, 12)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | System.arraycopy(asciiByte, 0, data, 3, 12); | 
|---|
|  |  |  | data[1] = HexUtil.hexToByte(HexUtil.get10to16(domainLength)); | 
|---|
|  |  |  | String portStr = String.valueOf(port); | 
|---|
|  |  |  | int lenght = portStr.length(); | 
|---|
|  |  |  | for (int i = 0; i < 5 - lenght; i++) { | 
|---|
|  |  |  | portStr = "0" + portStr; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String ascii = IDN.toASCII(domainName + "," + portStr + "#"); | 
|---|
|  |  |  | asciiByte = ascii.getBytes(); | 
|---|
|  |  |  | System.arraycopy(asciiByte, 0, data, 2, Math.min(asciiByte.length, 13)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | data[15] = getByteSum(data); | 
|---|
|  |  |  | return data; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 用户卡1块 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public class One extends BaseCard { | 
|---|
|  |  |  | public class One extends HNBaseCard { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public byte[] toBytes() { | 
|---|
|  |  |  | byte[] data = new byte[16]; | 
|---|
|  |  |  | if (asciiByte.length > 12) { | 
|---|
|  |  |  | if (asciiByte.length - 12 < 15) { | 
|---|
|  |  |  | System.arraycopy(asciiByte, 12, data, 0, asciiByte.length - 12); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | System.arraycopy(asciiByte, 12, data, 0, 15); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | int offset = (type == 0) ? 12 : 13; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (asciiByte.length > offset) { | 
|---|
|  |  |  | System.arraycopy(asciiByte, offset, data, 0, Math.min(asciiByte.length - offset, 15)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | data[15] = getByteSum(data); | 
|---|
|  |  |  | return data; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 用户卡2块 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public class Two extends BaseCard { | 
|---|
|  |  |  | public class Two extends HNBaseCard { | 
|---|
|  |  |  | public byte[] toBytes() { | 
|---|
|  |  |  | byte[] data = new byte[16]; | 
|---|
|  |  |  | if (asciiByte.length > (12 + 15)) { | 
|---|
|  |  |  | if (asciiByte.length - (12 + 15) < 15) { | 
|---|
|  |  |  | System.arraycopy(asciiByte, 12, data, 0, asciiByte.length - (12 + 15)); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | System.arraycopy(asciiByte, 12, data, 0, 15); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | int offset = (type == 0) ? 27 : 28; // 12 + 15 and 13 + 15 | 
|---|
|  |  |  | if (asciiByte.length > offset) { | 
|---|
|  |  |  | int lengthToCopy = Math.min(asciiByte.length - offset, 15); | 
|---|
|  |  |  | System.arraycopy(asciiByte, offset, data, 0, lengthToCopy); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | data[15] = getByteSum(data); | 
|---|
|  |  |  | return data; | 
|---|