package com.zehong.gassdevicereport.utils;

import java.math.BigInteger;

public class HexUtils {
    /**
     * 字节转十六进制
     * @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;
    }

    /**
     * 字节数组转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();
    }

    /**
     * Hex字符串转byte
     * @param inHex 待转换的Hex字符串
     * @return  转换后的byte
     */
    public static byte hexToByte(String inHex){
        return (byte)Integer.parseInt(inHex,16);
    }

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

    /**
     * 十六进制转单浮点
     * @param hex
     * @return
     */
    public static float hexToFloat(String hex){
        //Integer i = Integer.valueOf(hex.trim(), 16);
        //return Float.intBitsToFloat(i);
        return Float.intBitsToFloat(new BigInteger(hex.trim(), 16).intValue());

    }

    /**
     * 十六进制转浮点
     * @param hex
     * @return
     */
    public static double hexToDouble(String hex){
        Long l = Long.valueOf(hex,16).longValue();
        return Double.longBitsToDouble(l);
    }

    /**
     * 十六进制转二进制
     * @param hex
     * @return
     */
    public static String hexToBinary(String hex){
        Integer num = Integer.parseInt(hex,16);
        return Integer.toBinaryString(num);
    }
}