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