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 HNBaseCard { 
 | 
        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 HNBaseCard { 
 | 
  
 | 
        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 HNBaseCard { 
 | 
        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; 
 | 
        } 
 | 
    } 
 | 
} 
 |