package com.dayu.baselibrary.tools; 
 | 
  
 | 
import java.math.BigInteger; 
 | 
import java.nio.ByteBuffer; 
 | 
import java.nio.ByteOrder; 
 | 
import java.util.ArrayList; 
 | 
import java.util.Arrays; 
 | 
import java.util.Collections; 
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * Copyright (C), 2022, 
 | 
 * Author: zuo 
 | 
 * Date: 2022/3/9 14:55 
 | 
 * Description: 
 | 
 */ 
 | 
public class HexUtil { 
 | 
  
 | 
    /** 
 | 
     * short10进制转16进制 低位在前高位在后 
 | 
     * 
 | 
     * @param number 
 | 
     * @return 
 | 
     */ 
 | 
    public static String get10To16LowHigh(int number) { 
 | 
        // 使用 Integer.toHexString 将 int 转换为十六进制字符串 
 | 
        String hexString = Integer.toHexString(number); 
 | 
  
 | 
        hexString = spaceHex(hexString); 
 | 
        hexString = HighLowHex(hexString); 
 | 
        return hexString; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 16进制转10进制并且低位在前高位在后 
 | 
     * 
 | 
     * @param data 
 | 
     * @return 
 | 
     */ 
 | 
    public static int get16To10LowHightByBytes(byte[] data) { 
 | 
        List<Byte> byteList = new ArrayList<>(); 
 | 
        for (byte b : data) { 
 | 
            byteList.add(b); 
 | 
        } 
 | 
        Collections.reverse(byteList); 
 | 
        byte[] byteArray = new byte[byteList.size()]; 
 | 
        for (int i = 0; i < byteList.size(); i++) { 
 | 
            byteArray[i] = byteList.get(i); 
 | 
        } 
 | 
        String hex = bytesToHex(byteArray); 
 | 
        return Integer.parseInt(hex, 16); 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    public static int getBcdToInt(byte data) { 
 | 
        return ((data & 0xF0) >> 4) * 10 + ((data & 0x0F)); 
 | 
    } 
 | 
  
 | 
  
 | 
    public static byte[] getIntToBCD(int number) { 
 | 
        // 获取整数的字符串表示形式 
 | 
        String numberStr = Integer.toString(number); 
 | 
  
 | 
        // 创建一个字节数组以存储BCD表示 
 | 
        int len = numberStr.length(); 
 | 
        byte[] bcd = new byte[(len + 1) / 2]; 
 | 
  
 | 
        int j = 0; 
 | 
        // 如果数字的长度是奇数,需要在前面添加一个0 
 | 
        if (len % 2 != 0) { 
 | 
            numberStr = "0" + numberStr; // 先添加前导零 
 | 
            len++; 
 | 
        } 
 | 
  
 | 
        // 将每一对数字转换为一个字节 
 | 
        for (int i = 0; i < len; i += 2) { 
 | 
            bcd[j++] = (byte) (((numberStr.charAt(i) - '0') << 4) | (numberStr.charAt(i + 1) - '0')); 
 | 
        } 
 | 
  
 | 
        return bcd; 
 | 
    } 
 | 
    /** 
 | 
     * short10进制转16进制 低位在前高位在后 
 | 
     * 
 | 
     * @param number 
 | 
     * @return 
 | 
     */ 
 | 
    public static String get10To16LowHigh(short number) { 
 | 
        // 使用 Integer.toHexString 将 short 转换为十六进制字符串 
 | 
        int intValue = Short.toUnsignedInt(number); 
 | 
        // 使用 Integer.toHexString 将 int 转换为十六进制字符串 
 | 
        String hexString = Integer.toHexString(intValue); 
 | 
        // 补0,确保字符串长度为4 
 | 
        while (hexString.length() < 4) { 
 | 
            hexString = "0" + hexString; 
 | 
        } 
 | 
        hexString = spaceHex(hexString); 
 | 
        hexString = HighLowHex(hexString); 
 | 
        return hexString; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 将byte数组转换为带符号的32位浮点数 
 | 
     * <p> 
 | 
     * 低位在前高位在后 
 | 
     * 
 | 
     * @param value 
 | 
     * @return 
 | 
     */ 
 | 
    public static Float bytesToFloat(byte[] value) { 
 | 
        ByteBuffer bufferLittleEndian = ByteBuffer.wrap(value); 
 | 
        bufferLittleEndian.order(ByteOrder.LITTLE_ENDIAN); 
 | 
        return bufferLittleEndian.getFloat(); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * hex字符串转byte数组 
 | 
     * 
 | 
     * @param inHex 待转换的Hex字符串 
 | 
     * @return 转换后的byte数组结果 
 | 
     */ 
 | 
    public static byte[] hexToByteArray(String inHex) { 
 | 
        int hexlen = inHex.length(); 
 | 
        byte[] result; 
 | 
        if (hexlen % 2 == 1) { 
 | 
            //奇数 
 | 
            hexlen++; 
 | 
            result = new byte[(hexlen / 2)]; 
 | 
            inHex = "0" + inHex; 
 | 
        } else { 
 | 
            //偶数 
 | 
            result = new byte[(hexlen / 2)]; 
 | 
        } 
 | 
        int j = 0; 
 | 
        for (int i = 0; i < hexlen; i += 2) { 
 | 
            result[j] = hexToByte(inHex.substring(i, i + 2)); 
 | 
            j++; 
 | 
        } 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * Hex字符串转byte 
 | 
     * 
 | 
     * @param inHex 待转换的Hex字符串 
 | 
     * @return 转换后的byte 
 | 
     */ 
 | 
    public static byte hexToByte(String inHex) { 
 | 
        return (byte) Integer.parseInt(inHex, 16); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 字节转十六进制 
 | 
     * 
 | 
     * @param b 需要进行转换的byte字节 
 | 
     * @return 转换后的Hex字符串 
 | 
     */ 
 | 
    public static String byteToHex(byte b) { 
 | 
        String hex = Integer.toHexString(b & 0xFF); 
 | 
        if (hex.length() < 2) { 
 | 
            hex = "0" + hex; 
 | 
        } 
 | 
        return hex.toUpperCase(); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 字节数组转16进制 
 | 
     * 
 | 
     * @param bytes 需要转换的byte数组 
 | 
     * @return 转换后的Hex字符串 
 | 
     */ 
 | 
    public static String bytesToHex(byte[] bytes) { 
 | 
        StringBuffer sb = new StringBuffer(); 
 | 
        for (int i = 0; i < bytes.length; i++) { 
 | 
            String hex = Integer.toHexString(bytes[i] & 0xFF); 
 | 
            if (hex.length() < 2) { 
 | 
                sb.append(0); 
 | 
            } 
 | 
            sb.append(hex); 
 | 
        } 
 | 
        return sb.toString(); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 将 4字节的16进制字符串,转换为32位带符号的十进制浮点型 
 | 
     * 
 | 
     * @param str 4字节 16进制字符 
 | 
     * @return 
 | 
     */ 
 | 
    public static float hexToFloat(String str) { 
 | 
        return Float.intBitsToFloat(new BigInteger(str, 16).intValue()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 将带符号的32位浮点数装换为16进制 
 | 
     * 
 | 
     * @param value 
 | 
     * @return 
 | 
     */ 
 | 
    public static String folatToHexString(Float value) { 
 | 
        return Integer.toHexString(Float.floatToIntBits(value)); 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * float转Hex低位在前高位在后 
 | 
     * 
 | 
     * @param value 
 | 
     * @return 
 | 
     */ 
 | 
    public static String floatToHexLowHigh(Float value) { 
 | 
        String hexString = Integer.toHexString(Float.floatToIntBits(value)); 
 | 
        hexString = spaceHex(hexString); 
 | 
        hexString = HighLowHex(hexString); 
 | 
        return hexString; 
 | 
    } 
 | 
  
 | 
  
 | 
    public static float hexToFloatLowHigh(byte[] data) { 
 | 
        List<Byte> byteList = new ArrayList<>(); 
 | 
        for (byte b : data) { 
 | 
            byteList.add(b); 
 | 
        } 
 | 
        Collections.reverse(byteList); 
 | 
        byte[] byteArray = new byte[byteList.size()]; 
 | 
        for (int i = 0; i < byteList.size(); i++) { 
 | 
            byteArray[i] = byteList.get(i); 
 | 
        } 
 | 
        String hex = bytesToHex(byteArray); 
 | 
        int intValue = Integer.parseInt(hex, 16); // 将十六进制字符串转换为整数表示 
 | 
        float floatValue = Float.intBitsToFloat(intValue); // 将整数表示转换为浮点数 
 | 
        return floatValue; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 十进制转16进制 
 | 
     * 
 | 
     * @param number 
 | 
     * @return 
 | 
     */ 
 | 
    public static String get10to16(int number) { 
 | 
        return Integer.toHexString(number); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 十进制转16进制 补齐偶数 高位在前低位在后 
 | 
     * 
 | 
     * @param number 
 | 
     * @return 
 | 
     */ 
 | 
    public static String get10to16CompleteHex(int number) { 
 | 
        String hex = Integer.toHexString(number); 
 | 
        if (hex.length() % 2 == 0) { 
 | 
            return hex; 
 | 
        } else { 
 | 
            return "0" + hex; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 十进制转16进制低位在前高位在后 
 | 
     * 
 | 
     * @param number 十进制数 
 | 
     * @param length 补足多少位 
 | 
     * @return 
 | 
     */ 
 | 
    public static String get10to16LowHigh(int number, int length) { 
 | 
        String str = ""; 
 | 
        try { 
 | 
            str = Integer.toHexString(number); 
 | 
            str = getHexToLenght(str, length); 
 | 
            str = spaceHex(str); 
 | 
            str = HighLowHex(str); 
 | 
  
 | 
        } catch (Exception e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        return str; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 返回特定长度的16进制字符串 
 | 
     * 
 | 
     * @param data 
 | 
     * @param length 
 | 
     * @return 
 | 
     */ 
 | 
    public static String getHexToLenght(String data, int length) { 
 | 
        StringBuffer stringBuilder = new StringBuffer(data); 
 | 
        for (int i = 0; i < length - data.length(); i++) { 
 | 
            stringBuilder.insert(0, "0"); 
 | 
        } 
 | 
        return stringBuilder.toString(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 十六进制数隔空位 
 | 
     * 
 | 
     * @param str 
 | 
     * @return 
 | 
     */ 
 | 
    public static String spaceHex(String str) { 
 | 
        if (str.length() % 2 != 0) { 
 | 
            //奇数时前面加0补齐称为偶数 
 | 
            str = "0" + str; 
 | 
        } 
 | 
        char[] array = str.toCharArray(); 
 | 
        if (str.length() <= 2) return str; 
 | 
        StringBuffer bufferHex = new StringBuffer(); 
 | 
        for (int i = 0; i < array.length; i++) { 
 | 
            int start = i + 1; 
 | 
            if (start % 2 == 0) { 
 | 
                bufferHex.append(array[i]).append(" "); 
 | 
            } else { 
 | 
                bufferHex.append(array[i]); 
 | 
            } 
 | 
        } 
 | 
        return bufferHex.toString(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 高位16进制转低位 
 | 
     * 
 | 
     * @param str 
 | 
     * @return 
 | 
     */ 
 | 
    public static String HighLowHex(String str) { 
 | 
        if (str.trim().length() <= 2) return str; 
 | 
        List<String> list = Arrays.asList(str.split(" ")); 
 | 
        Collections.reverse(list); 
 | 
        StringBuffer stringBuffer = new StringBuffer(); 
 | 
        for (String string : list) { 
 | 
            stringBuffer.append(string); 
 | 
        } 
 | 
        return stringBuffer.toString(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * @param hex 
 | 
     * @return 
 | 
     */ 
 | 
    public static int get16to10(String hex) { 
 | 
        int x = 0; 
 | 
        try { 
 | 
            x = Integer.parseInt(hex, 16); 
 | 
        } catch (NumberFormatException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        return x; 
 | 
    } 
 | 
} 
 |