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.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 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 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 domainXinXiangCard = new DomainCard();
|
String domainNumber = BcdUtil.bcdToStr(data.get(0)[1]);
|
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();
|
}
|
}
|
}
|
|
return domainXinXiangCard;
|
} 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);
|
domainLength = domainName.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 {
|
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 byte[] toBytes() {
|
byte[] data = new byte[16];
|
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 byte[] toBytes() {
|
byte[] data = new byte[16];
|
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;
|
}
|
}
|
}
|