package com.dayu.qihealonelibrary.card;
|
|
|
import com.dayu.baselibrary.tools.BcdUtil;
|
import com.dayu.baselibrary.tools.HexUtil;
|
import com.dayu.qihealonelibrary.utils.MyCommon;
|
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 = MyCommon.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<byte[]> 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;
|
}
|
}
|
}
|