| package com.dayu.henanlibrary.card; | 
|   | 
| import com.dayu.baselibrary.bean.BaseUserCardCard; | 
| import com.dayu.baselibrary.tools.BcdUtil; | 
| import com.dayu.baselibrary.tools.HexUtil; | 
| import com.dayu.henanlibrary.utils.CardCommon; | 
|   | 
| import java.io.Serializable; | 
| import java.util.Calendar; | 
| import java.util.List; | 
|   | 
| /** | 
|  * Copyright (C), 2023, | 
|  * Author: zuo | 
|  * Date: 2023-11-07 9:37 | 
|  * Description: 用户卡结构 | 
|  */ | 
| public class UserCardHN extends BaseUserCardCard implements Serializable { | 
|     public String cardType = CardCommon.USER_CARD_TYPE_1;//写卡标志 A1刷卡开泵前 A8刷卡开泵后  A2叠加充值 | 
|   | 
|     public int rechargeTimes;//充值次数 | 
|   | 
|     public int swipeNumber;//刷卡次数 一般不用精细管控才用 | 
|   | 
|     public float electricityPrice;//电量单价 管理元可以修改 | 
|   | 
|     public String state = "00";//卡状态 返写查询充值时卡状态位 | 
|   | 
|     public int balance;//余额(单位为分) | 
|   | 
|     public String addressCode;//行政区域 | 
|   | 
|     public Calendar rechargeDate;//购水时间 | 
|   | 
|     public String initPeasantCode;//用户注册编号 | 
|   | 
|   | 
|     public byte[] getZeroBytes() { | 
|         Zero zero = new Zero(); | 
|         return zero.toByte(); | 
|     } | 
|   | 
|     public byte[] getOneBytes() { | 
|         One zero = new One(); | 
|         return zero.toBytes(); | 
|     } | 
|   | 
|     public byte[] getTwoBytes() { | 
|         Two zero = new Two(); | 
|         return zero.toBytes(); | 
|     } | 
|   | 
|     /** | 
|      * 通过byte转bean | 
|      * | 
|      * @param data 读卡的数据 | 
|      */ | 
|     @Override | 
|     public  UserCardHN getBean(List<byte[]> data) { | 
|         try { | 
|   | 
|             if (data != null) { | 
|                 byte[] zero = data.get(0); | 
|                 byte[] one = data.get(1); | 
|                 byte[] two = data.get(2); | 
|                 if (zero != null && zero.length == 16) { | 
|                     UserCardHN userCard = new UserCardHN(); | 
|                     userCard.cardType = HexUtil.byteToHex(zero[0]); | 
|                     userCard.rechargeTimes = HexUtil.get16to10(HexUtil.byteToHex(zero[1])); | 
|                     byte[] swipeNumberBytes = new byte[2]; | 
|                     System.arraycopy(zero, 2, swipeNumberBytes, 0, swipeNumberBytes.length); | 
|                     String swipeNumberHex = HexUtil.bytesToHex(swipeNumberBytes); | 
|                     userCard.swipeNumber = (short) HexUtil.get16to10(swipeNumberHex); | 
|                     byte[] electricityPriceBytes = new byte[4]; | 
|                     System.arraycopy(zero, 4, electricityPriceBytes, 0, electricityPriceBytes.length); | 
|   | 
|                     userCard.electricityPrice = HexUtil.hexToFloatLowHigh(electricityPriceBytes); | 
|                     userCard.state = BcdUtil.bcdToStr(zero[8]); | 
|                     byte[] balanceBytes = new byte[4]; | 
|                     System.arraycopy(zero, 9, balanceBytes, 0, balanceBytes.length); | 
|   | 
|   | 
| //                    userCard.balance = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(balanceBytes)); | 
|                     userCard.balance = HexUtil.get16To10LowHightByBytes(balanceBytes); | 
|                     byte[] addressCodeBytes = new byte[6]; | 
|                     System.arraycopy(zero, 13, addressCodeBytes, 0, 2); | 
|                     System.arraycopy(two, 11, addressCodeBytes, 2, 4); | 
|                     userCard.addressCode = BcdUtil.bcdToStr(addressCodeBytes); | 
|   | 
|                     int year = 0; | 
|                     int month = 0; | 
|                     int day = 0; | 
|                     int hour = 0; | 
|                     int minute = 0; | 
|                     int second = 0; | 
|                     for (int i = 0; i < 6; i++) { | 
|                         byte byteData = one[i + 4]; | 
|                         switch (i) { | 
|                             case 0: | 
|                                 year = getBcdToInt(byteData); | 
|                                 break; | 
|                             case 1: | 
|                                 month = getBcdToInt(byteData); | 
|                                 break; | 
|                             case 2: | 
|                                 day = getBcdToInt(byteData); | 
|                                 break; | 
|                             case 3: | 
|                                 hour = getBcdToInt(byteData); | 
|                                 break; | 
|                             case 4: | 
|                                 minute = getBcdToInt(byteData); | 
|                                 break; | 
|                             case 5: | 
|                                 second = getBcdToInt(byteData); | 
|                                 break; | 
|                         } | 
|                     } | 
|                     Calendar calendar = Calendar.getInstance(); | 
|                     calendar.set(2000 + year, month, day, hour, minute, second); | 
|                     byte[] initPeasantCodeBytes = new byte[16]; | 
|                     System.arraycopy(one, 10, initPeasantCodeBytes, 0, 5); | 
|                     System.arraycopy(two, 0, initPeasantCodeBytes, 5, 11); | 
|                     userCard.initPeasantCode = HexUtil.bytesToHex(initPeasantCodeBytes); | 
|                     return userCard; | 
|                 } | 
|   | 
|                 return null; | 
|             } | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|             return null; | 
|         } | 
|         return null; | 
|     } | 
|   | 
|   | 
|     private static int getBcdToInt(byte data) { | 
|         return ((data & 0xF0) >> 4) * 10 + ((data & 0x0F)); | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 用户卡0块 | 
|      */ | 
|     public class Zero { | 
|         public byte[] toByte() { | 
|             byte[] data = new byte[16]; | 
|             data[0] = HexUtil.hexToByte(cardType); | 
|             try { | 
|                 data[1] = HexUtil.hexToByte(HexUtil.get10to16(rechargeTimes)); | 
|             } catch (Exception e) { | 
|                 e.printStackTrace(); | 
|             } | 
|             byte[] swipeNumbers = HexUtil.hexToByteArray(HexUtil.get10to16(swipeNumber)); | 
|   | 
|             System.arraycopy(swipeNumbers, 0, data, 2, swipeNumbers.length); | 
|   | 
|             byte[] electricityPrices = HexUtil.hexToByteArray(HexUtil.floatToHexLowHigh(electricityPrice)); | 
|   | 
|             System.arraycopy(electricityPrices, 0, data, 4, electricityPrices.length); | 
|             try { | 
|                 data[8] = BcdUtil.strToBcd(state)[0]; | 
|             } catch (Exception e) { | 
|                 e.printStackTrace(); | 
|             } | 
|             byte[] balances = HexUtil.hexToByteArray(HexUtil.get10to16LowHigh(balance, 8)); | 
|   | 
|             System.arraycopy(balances, 0, data, 9, balances.length); | 
|             byte[] addresscodes = BcdUtil.strToBcd(addressCode); | 
|             System.arraycopy(addresscodes, 0, data, 13, 2); | 
|             data[15] = getByteSum(data); | 
|             return data; | 
|         } | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 用户卡1块 | 
|      */ | 
|     public class One { | 
|   | 
|         public byte[] toBytes() { | 
|             byte[] data = new byte[16]; | 
|             byte[] balances = HexUtil.hexToByteArray(HexUtil.get10to16LowHigh(balance, 8)); | 
|             System.arraycopy(balances, 0, data, 0, balances.length); | 
|             if (rechargeDate != null) { | 
|                 // 获取年、月、日、时、分、秒 | 
|   | 
| //                bcdBytes[0] = (byte) ((year / 1000) << 4) | (byte) (year % 1000 / 100); // 年份的十位和个位(高字节) | 
| //                bcdBytes[1] = (byte) ((year / 10 % 10) << 4) | (byte) (year % 10); // 年份的十位和个位(低字节) | 
|                 int year = (rechargeDate.get(Calendar.YEAR)) % 1000; | 
|                 int month = rechargeDate.get(Calendar.MONTH) + 1; // 月份从0开始,所以需要加1 | 
|                 int day = rechargeDate.get(Calendar.DAY_OF_MONTH); | 
|                 int hour = rechargeDate.get(Calendar.HOUR_OF_DAY); | 
|                 int minute = rechargeDate.get(Calendar.MINUTE); | 
|                 int second = rechargeDate.get(Calendar.SECOND); | 
|   | 
|                 byte bcdYear = (byte) ((year / 10) << 4 | ((year % 10) / 100)); | 
|                 byte bcdMonth = (byte) ((month / 10) << 4 | (month % 10)); | 
|                 byte bcdDay = (byte) ((day / 10) << 4 | (day % 10)); | 
|                 byte bcdHour = (byte) ((hour / 10) << 4 | (hour % 10)); | 
|                 byte bcdMinute = (byte) ((minute / 10) << 4 | (minute % 10)); | 
|                 byte bcdSecond = (byte) ((second / 10) << 4 | (second % 10)); | 
|   | 
|                 data[4] = bcdYear; | 
|                 data[5] = bcdMonth; | 
|                 data[6] = bcdDay; | 
|                 data[7] = bcdHour; | 
|                 data[8] = bcdMinute; | 
|                 data[9] = bcdSecond; | 
|             } | 
|             byte[] initPeasantCodes = HexUtil.hexToByteArray(initPeasantCode); | 
|             System.arraycopy(initPeasantCodes, 0, data, 10, 5); | 
|             data[15] = getByteSum(data); | 
|             return data; | 
|         } | 
|   | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 用户卡2块 | 
|      */ | 
|     public class Two { | 
|         public byte[] toBytes() { | 
|             byte[] data = new byte[16]; | 
|             byte[] initPeasantCodes = HexUtil.hexToByteArray(initPeasantCode); | 
|             System.arraycopy(initPeasantCodes, 5, data, 0, 11); | 
|             byte[] addresscodes = BcdUtil.strToBcd(addressCode); | 
|             data[11] = addresscodes[2]; | 
|             data[12] = addresscodes[3]; | 
|             data[13] = addresscodes[4]; | 
|             data[14] = addresscodes[5]; | 
|             data[15] = getByteSum(data); | 
|             return data; | 
|         } | 
|     } | 
|   | 
|   | 
|     public String getCardType() { | 
|         return cardType; | 
|     } | 
|   | 
|     public void setCardType(String cardType) { | 
|         this.cardType = cardType; | 
|     } | 
|   | 
|     public int getRechargeTimes() { | 
|         return rechargeTimes; | 
|     } | 
|   | 
|     public void setRechargeTimes(int rechargeTimes) { | 
|         this.rechargeTimes = rechargeTimes; | 
|     } | 
|   | 
|   | 
|     public int getSwipeNumber() { | 
|         return swipeNumber; | 
|     } | 
|   | 
|     public void setSwipeNumber(int swipeNumber) { | 
|         this.swipeNumber = swipeNumber; | 
|     } | 
|   | 
|     public float getElectricityPrice() { | 
|         return electricityPrice; | 
|     } | 
|   | 
|     public void setElectricityPrice(float electricityPrice) { | 
|         this.electricityPrice = electricityPrice; | 
|     } | 
|   | 
|     public String getState() { | 
|         return state; | 
|     } | 
|   | 
|     public void setState(String state) { | 
|         this.state = state; | 
|     } | 
|   | 
|     public int getBalance() { | 
|         return balance; | 
|     } | 
|   | 
|     public void setBalance(int balance) { | 
|         this.balance = balance; | 
|     } | 
|   | 
|     public String getAddressCode() { | 
|         return addressCode; | 
|     } | 
|   | 
|     public void setAddressCode(String addressCode) { | 
|         this.addressCode = addressCode; | 
|     } | 
|   | 
|     public Calendar getRechargeDate() { | 
|         return rechargeDate; | 
|     } | 
|   | 
|     public void setRechargeDate(Calendar rechargeDate) { | 
|         this.rechargeDate = rechargeDate; | 
|     } | 
|   | 
|     public String getInitPeasantCode() { | 
|         return initPeasantCode; | 
|     } | 
|   | 
|     public void setInitPeasantCode(String initPeasantCode) { | 
|         this.initPeasantCode = initPeasantCode; | 
|     } | 
|   | 
|   | 
| } |