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