package com.dayu.qiheonlinelibrary.card; import com.dayu.baselibrary.tools.BcdUtil; import com.dayu.baselibrary.tools.HexUtil; import com.dayu.qiheonlinelibrary.utils.CardCommon; import com.tencent.bugly.crashreport.CrashReport; import java.io.Serializable; import java.net.IDN; import java.nio.charset.StandardCharsets; import java.util.List; /** * Copyright (C), 2023, * Author: zuo * Date: 2023-11-08 11:47 * Description:设置域名卡: */ public class DomainCard implements Serializable { public String cardType = CardCommon.DOMAIN_CARD_TYPE;//卡类型 public String domainNumber;//域名序号 (BCD格式) public int domainLength;//域名长度 //端口号为5个字节,不足5位高位补0。端口号与域名之间用”,”隔开。端口号最后以”#”结束 public String domainName;//域名 public int port;//端口 public String getDomainName() { return domainName; } public void setDomainName(String domainName) { this.domainName = domainName; } public String getDomainNumber() { return domainNumber; } public void setDomainNumber(String domainNumber) { this.domainNumber = domainNumber; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } private byte[] asciiByte;//当前域名和端口号数组 public byte[] getZeroByte() { Zero zero = new Zero(); return zero.toByte(); } public byte[] getOneByte() { One one = new One(); return one.toBytes(); } public byte[] getTwoByte() { Two two = new Two(); return two.toBytes(); } public static DomainCard toBean(List data) { try { DomainCard domainCard = 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++; } } } 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; } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } return null; } /** * 用户卡0块 */ public class Zero extends BaseCard { 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); } else { System.arraycopy(asciiByte, 0, data, 3, 12); } data[15] = getByteSum(data); return data; } } /** * 用户卡1块 */ public class One extends BaseCard { 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); } } data[15] = getByteSum(data); return data; } } /** * 用户卡2块 */ public class Two extends BaseCard { 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); } } data[15] = getByteSum(data); return data; } } }