package com.hdl.sdk.link.core.utils; 
 | 
  
 | 
import android.util.Log; 
 | 
  
 | 
import java.math.BigDecimal; 
 | 
import java.text.SimpleDateFormat; 
 | 
import java.util.Arrays; 
 | 
import java.util.Date; 
 | 
  
 | 
/** 
 | 
 * Created by Zoro 
 | 
 * Created on 2021/9/17 
 | 
 * description: 
 | 
 */ 
 | 
public class HexUtil { 
 | 
    private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', 
 | 
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 
 | 
  
 | 
    private static final char[] DIGITS_UPPER = {'0', '1', '2', '3', '4', '5', 
 | 
            '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
 | 
  
 | 
    public static char[] encodeHex(byte[] data) { 
 | 
        return encodeHex(data, true); 
 | 
    } 
 | 
  
 | 
    public static char[] encodeHex(byte[] data, boolean toLowerCase) { 
 | 
        return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); 
 | 
    } 
 | 
  
 | 
    protected static char[] encodeHex(byte[] data, char[] toDigits) { 
 | 
        if (data == null) 
 | 
            return null; 
 | 
        int l = data.length; 
 | 
        char[] out = new char[l << 1]; 
 | 
        for (int i = 0, j = 0; i < l; i++) { 
 | 
            out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; 
 | 
            out[j++] = toDigits[0x0F & data[i]]; 
 | 
        } 
 | 
        return out; 
 | 
    } 
 | 
  
 | 
  
 | 
    public static String encodeHexStr(byte[] data) { 
 | 
        return encodeHexStr(data, true); 
 | 
    } 
 | 
  
 | 
    public static String encodeHexStr(byte[] data, boolean toLowerCase) { 
 | 
        return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); 
 | 
    } 
 | 
  
 | 
  
 | 
    protected static String encodeHexStr(byte[] data, char[] toDigits) { 
 | 
        return new String(encodeHex(data, toDigits)); 
 | 
    } 
 | 
  
 | 
    public static String formatHexString(byte[] data) { 
 | 
        return formatHexString(data, false); 
 | 
    } 
 | 
  
 | 
    public static String formatHexString(byte[] data, boolean addSpace) { 
 | 
        if (data == null || data.length < 1) 
 | 
            return null; 
 | 
        StringBuilder sb = new StringBuilder(); 
 | 
        for (int i = 0; i < data.length; i++) { 
 | 
            String hex = Integer.toHexString(data[i] & 0xFF); 
 | 
            if (hex.length() == 1) { 
 | 
                hex = '0' + hex; 
 | 
            } 
 | 
            sb.append(hex); 
 | 
            if (addSpace) 
 | 
                sb.append(" "); 
 | 
        } 
 | 
        return sb.toString().trim(); 
 | 
    } 
 | 
  
 | 
    public static byte[] decodeHex(char[] data) { 
 | 
  
 | 
        int len = data.length; 
 | 
  
 | 
        if ((len & 0x01) != 0) { 
 | 
            throw new RuntimeException("Odd number of characters."); 
 | 
        } 
 | 
  
 | 
        byte[] out = new byte[len >> 1]; 
 | 
  
 | 
        // two characters form the hex value. 
 | 
        for (int i = 0, j = 0; j < len; i++) { 
 | 
            int f = toDigit(data[j], j) << 4; 
 | 
            j++; 
 | 
            f = f | toDigit(data[j], j); 
 | 
            j++; 
 | 
            out[i] = (byte) (f & 0xFF); 
 | 
        } 
 | 
  
 | 
        return out; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 将十六进制字符串解码为byte[] 
 | 
     * 
 | 
     * @param hexStr 十六进制String 
 | 
     * @return byte[] 
 | 
     */ 
 | 
    public static byte[] decodeHex(String hexStr) { 
 | 
        if ("".equals(hexStr)) { 
 | 
            return null; 
 | 
        } 
 | 
        hexStr = hexStr.replace(" ",""); 
 | 
        return decodeHex(hexStr.toCharArray()); 
 | 
    } 
 | 
  
 | 
    public static byte[] addAll(byte[]... arrays) { 
 | 
        if (arrays.length == 1) { 
 | 
            return arrays[0]; 
 | 
        } 
 | 
  
 | 
        // 计算总长度 
 | 
        int length = 0; 
 | 
        for (byte[] array : arrays) { 
 | 
            if (null != array) { 
 | 
                length += array.length; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        final byte[] result = new byte[length]; 
 | 
        length = 0; 
 | 
        for (byte[] array : arrays) { 
 | 
            if (null != array) { 
 | 
                System.arraycopy(array, 0, result, length, array.length); 
 | 
                length += array.length; 
 | 
            } 
 | 
        } 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    protected static int toDigit(char ch, int index) { 
 | 
        int digit = Character.digit(ch, 16); 
 | 
        if (digit == -1) { 
 | 
            throw new RuntimeException("Illegal hexadecimal character " + ch 
 | 
                    + " at index " + index); 
 | 
        } 
 | 
        return digit; 
 | 
    } 
 | 
  
 | 
  
 | 
    public static byte[] hexStringToBytes(String hexString) { 
 | 
        if (hexString == null || hexString.equals("")) { 
 | 
            return null; 
 | 
        } 
 | 
        hexString = hexString.toUpperCase(); 
 | 
        int length = hexString.length() / 2; 
 | 
        char[] hexChars = hexString.toCharArray(); 
 | 
        byte[] d = new byte[length]; 
 | 
        for (int i = 0; i < length; i++) { 
 | 
            int pos = i * 2; 
 | 
            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); 
 | 
        } 
 | 
        return d; 
 | 
    } 
 | 
  
 | 
    public static byte charToByte(char c) { 
 | 
        return (byte) "0123456789ABCDEF".indexOf(c); 
 | 
    } 
 | 
  
 | 
    public static String extractData(byte[] data, int position) { 
 | 
        return HexUtil.formatHexString(new byte[]{data[position]}); 
 | 
    } 
 | 
  
 | 
    public static String bytesToHexString(byte[] data) { 
 | 
        String result = ""; 
 | 
        for (int i = 0; i < data.length; i++) { 
 | 
            String hexString = Integer.toHexString(data[i] & 0xFF); 
 | 
            if (hexString.length() == 1) { 
 | 
                hexString = '0' + hexString; 
 | 
            } 
 | 
            result += hexString.toUpperCase(); 
 | 
        } 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * byte转16进制 
 | 
     * 
 | 
     * @param b 
 | 
     * @return 
 | 
     */ 
 | 
    public static String binaryToHex(byte b) { 
 | 
        String str = byteToBit(b); 
 | 
        String hexStr = Integer.toHexString(Integer.parseInt(str, 2)); 
 | 
        StringBuffer stringBuffer = new StringBuffer(); 
 | 
        if (hexStr.length() == 1) { 
 | 
            stringBuffer.append("0"); 
 | 
        } 
 | 
        stringBuffer.append(hexStr); 
 | 
        return stringBuffer.toString().toUpperCase(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * byte转十进制 
 | 
     * 
 | 
     * @param b 
 | 
     * @return 
 | 
     */ 
 | 
    public static int binaryToDecimal(byte b) { 
 | 
        String str = byteToBit(b); 
 | 
        return Integer.parseInt(str, 2); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * Byte转Bit 
 | 
     */ 
 | 
    public static String byteToBit(byte b) { 
 | 
        return "" + (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1) 
 | 
                + (byte) ((b >> 5) & 0x1) + (byte) ((b >> 4) & 0x1) 
 | 
                + (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1) 
 | 
                + (byte) ((b >> 1) & 0x1) + (byte) ((b >> 0) & 0x1); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * int转byte 
 | 
     * 
 | 
     * @param res 
 | 
     * @return 
 | 
     */ 
 | 
    public static byte[] int2byte(int res) { 
 | 
        byte[] targets = new byte[2]; 
 | 
  
 | 
        targets[1] = (byte) (res & 0xff);// 最低位 
 | 
        targets[0] = (byte) ((res >> 8) & 0xff);// 次低位 
 | 
        /*targets[2] = (byte) ((res >> 16) & 0xff);// 次高位 
 | 
        targets[3] = (byte) (res >>> 24);// 最高位,无符号右移*/ 
 | 
        return targets; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * Bit转Byte 
 | 
     */ 
 | 
    public static byte bitToByte(String byteStr) { 
 | 
        int re, len; 
 | 
        if (null == byteStr) { 
 | 
            return 0; 
 | 
        } 
 | 
        len = byteStr.length(); 
 | 
        if (len != 4 && len != 8) { 
 | 
            return 0; 
 | 
        } 
 | 
        if (len == 8) {// 8 bit处理 
 | 
            if (byteStr.charAt(0) == '0') {// 正数 
 | 
                re = Integer.parseInt(byteStr, 2); 
 | 
            } else {// 负数 
 | 
                re = Integer.parseInt(byteStr, 2) - 256; 
 | 
            } 
 | 
        } else {// 4 bit处理 
 | 
            re = Integer.parseInt(byteStr, 2); 
 | 
        } 
 | 
        return (byte) re; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 解析体脂数据 
 | 
     * 
 | 
     * @param first 
 | 
     * @param second 
 | 
     * @param b 
 | 
     * @return 
 | 
     */ 
 | 
    public static double getData(int first, int second, byte[] b) { 
 | 
        double data = ((b[first] & 0xFF) << 8) + (b[second] & 0xFF); 
 | 
        Log.e("", "data = " + data); 
 | 
        return data / 10; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 解析体脂数据 
 | 
     * 
 | 
     * @param first 
 | 
     * @param second 
 | 
     * @param b 
 | 
     * @return 
 | 
     */ 
 | 
    public static int getDataInt(int first, int second, byte[] b) { 
 | 
        int data = ((b[first] & 0xFF) << 8) + (b[second] & 0xFF); 
 | 
        Log.e("", "getDataInt = " + data); 
 | 
        return data; 
 | 
    } 
 | 
  
 | 
  
 | 
    // 获取系统时间 
 | 
    public static String getTime() { 
 | 
        SimpleDateFormat formatter = new SimpleDateFormat("HHmmss"); 
 | 
        Date curDate = new Date(System.currentTimeMillis()); 
 | 
        String str = formatter.format(curDate); 
 | 
        return str; 
 | 
    } 
 | 
  
 | 
    // 获取系统日期 
 | 
    public static String getDate() { 
 | 
        SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd"); 
 | 
        Date curDate = new Date(System.currentTimeMillis()); 
 | 
        String str = formatter.format(curDate); 
 | 
        return str; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取当前系统时间 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public static String getCurrentTime() { 
 | 
        SimpleDateFormat formatter = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); 
 | 
        Date curDate = new Date(System.currentTimeMillis()); 
 | 
        String str = formatter.format(curDate); 
 | 
        return str; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 合并数组 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public static byte[] concat(byte[] b, byte[] mByte) { 
 | 
        byte[] result = Arrays.copyOf(b, b.length + mByte.length); 
 | 
        System.arraycopy(mByte, 0, result, b.length, mByte.length); 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 字符串长度等于1的话,补0 
 | 
     * 
 | 
     * @param str 
 | 
     * @return 
 | 
     */ 
 | 
    public static String addZero(String str) { 
 | 
        //L.i(ParseData.class, "addZero"); 
 | 
        StringBuffer sBuffer = new StringBuffer(); 
 | 
        if (str.length() == 1) { 
 | 
            sBuffer.append("0"); 
 | 
            sBuffer.append(str); 
 | 
            return sBuffer.toString(); 
 | 
        } else { 
 | 
            return str; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public static double getPercent(double d) { 
 | 
        if (d > 100) { 
 | 
            return 0.0; 
 | 
        } 
 | 
        return d; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * byte数组转str 
 | 
     * 
 | 
     * @param b 
 | 
     * @return 
 | 
     */ 
 | 
    public static String byteArr2Str(byte[] b) { 
 | 
        if (b.length != 0) { 
 | 
            StringBuffer stringBuffer = new StringBuffer(); 
 | 
            stringBuffer.append("["); 
 | 
            for (int i = 0; i < b.length; i++) { 
 | 
                stringBuffer.append(addZero(binaryToHex(b[i]))); 
 | 
                if (i < b.length - 1) { 
 | 
                    stringBuffer.append(","); 
 | 
                } 
 | 
            } 
 | 
            stringBuffer.append("]"); 
 | 
            return stringBuffer.toString(); 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 保留小数点后count位 
 | 
     * 
 | 
     * @param d 
 | 
     * @param count 
 | 
     * @return 
 | 
     */ 
 | 
    public static double keepDecimal(double d, int count) { 
 | 
        BigDecimal decimal = new BigDecimal(d); 
 | 
        return decimal.setScale(count, BigDecimal.ROUND_HALF_UP).doubleValue(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * kg转lb 
 | 
     * 
 | 
     * @param weight 
 | 
     * @return 
 | 
     */ 
 | 
    public static double kg2lb(double weight) { 
 | 
        return keepDecimal(weight * 2.2046226, 1); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * kg转jin 
 | 
     * 
 | 
     * @param weight 
 | 
     * @return 
 | 
     */ 
 | 
    public static double kg2jin(double weight) { 
 | 
        return keepDecimal(weight * 2, 1); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * kg转st 
 | 
     * 
 | 
     * @param weight 
 | 
     * @return 
 | 
     */ 
 | 
    public static String kg2st(double weight) { 
 | 
        double lbData = kg2lb(weight); 
 | 
        StringBuffer stringBuffer = new StringBuffer(); 
 | 
        int lb = (int) (lbData / 14); 
 | 
        int st = (int) lbData % 14; 
 | 
        stringBuffer.append(lb); 
 | 
        stringBuffer.append(":"); 
 | 
        stringBuffer.append(addZero(String.valueOf(st))); 
 | 
        return stringBuffer.toString(); 
 | 
    } 
 | 
  
 | 
    public static String int2HexStr(int i) { 
 | 
        return binaryToHex(Integer.valueOf(i).byteValue()); 
 | 
    } 
 | 
  
 | 
    public static byte[] hexStringToByte(String hex) { 
 | 
        int len = (hex.length() / 2); 
 | 
        byte[] result = new byte[len]; 
 | 
        char[] chars = hex.toCharArray(); 
 | 
        for (int i = 0; i < len; i++) { 
 | 
            int pos = i * 2; 
 | 
            result[i] = (byte) (toByte(chars[pos]) << 4 | toByte(chars[pos + 1])); 
 | 
        } 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    private static byte toByte(char c) { 
 | 
        byte b = (byte) "0123456789ABCDEF".indexOf(c); 
 | 
        return b; 
 | 
    } 
 | 
  
 | 
    public static String formatTo1(double f) { 
 | 
        BigDecimal bg = new BigDecimal(f); 
 | 
        return bg.setScale(1, BigDecimal.ROUND_HALF_UP).toString(); 
 | 
    } 
 | 
}  
 |