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