package com.dayu.qihealonelibrary.card; 
 | 
  
 | 
  
 | 
import com.dayu.baselibrary.tools.BcdUtil; 
 | 
import com.dayu.baselibrary.tools.HexUtil; 
 | 
import com.dayu.qihealonelibrary.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<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; 
 | 
        } 
 | 
    } 
 | 
} 
 |