Hex转化工具

package com.jquery.service.android.utils;


import android.util.Log;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


/**
 * 字符串与16进制转换工具
 * @param str
 */
public class HexUtils {
    private static final int[] DEC = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15};
    private static final byte[] HEX = new byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102};
    private static final char[] hex = "0123456789abcdef".toCharArray();
    private static String TAG = "HexUtils";

    public HexUtils() {
    }

    public static int getDec(int index) {
        try {
            return DEC[index - 48];
        } catch (ArrayIndexOutOfBoundsException var2) {
            return -1;
        }
    }

    public static byte getHex(int index) {
        return HEX[index];
    }

    public static String hexString2BinaryString(String hexString) {
        if (hexString == null || hexString.length() % 2 != 0)
            return null;
        String bString = "", tmp;
        for (int i = 0; i < hexString.length(); i++) {
            tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
            bString += tmp.substring(tmp.length() - 4);
        }
        return bString;
    }


    public static String binaryString2HexString(String bString) {
        if (bString == null || bString.equals("") || bString.length() % 8 != 0)
            return null;
        StringBuffer tmp = new StringBuffer();
        int iTmp = 0;
        for (int i = 0; i < bString.length(); i += 4) {
            iTmp = 0;
            for (int j = 0; j < 4; j++) {
                iTmp += Integer.parseInt(bString.substring(i + j, i + j + 1)) << (4 - j - 1);
            }
            tmp.append(Integer.toHexString(iTmp));
        }
        return tmp.toString();
    }

    public static String toHexString(byte[] bytes) {
        if (null == bytes) {
            return null;
        } else {
            StringBuilder sb = new StringBuilder(bytes.length << 1);

            for (int i = 0; i < bytes.length; ++i) {
                sb.append(hex[(bytes[i] & 240) >> 4]).append(hex[bytes[i] & 15]);
            }

            return sb.toString();
        }
    }

    public static byte[] fromHexString(String input) {
        if (input == null) {
            return null;
        } else if ((input.length() & 1) == 1) {
            throw new IllegalArgumentException("The input must consist of an even number of hex digits");
        } else {
            char[] inputChars = input.toCharArray();
            byte[] result = new byte[input.length() >> 1];

            for (int i = 0; i < result.length; ++i) {
                int upperNibble = getDec(inputChars[2 * i]);
                int lowerNibble = getDec(inputChars[2 * i + 1]);
                if (upperNibble < 0 || lowerNibble < 0) {
                    throw new IllegalArgumentException("The input must consist only of hex digits");
                }

                result[i] = (byte) ((upperNibble << 4) + lowerNibble);
            }

            return result;
        }
    }

    public static String decodeFromHexString(String hexString) {
        return new String(fromHexString(hexString));
    }

    /**
     * 高低位交换
     *
     * @param data           被交换数据,长度为switchUnitSize的整数倍
     * @param switchUnitSize 交换单元字节数,2的倍数
     * @return
     */
    public static byte[] byteHighLowSwitch(byte[] data, int switchUnitSize) {
        if (data == null || data.length < switchUnitSize
                || (switchUnitSize < 2 && switchUnitSize % 2 != 0)
                || data.length % switchUnitSize != 0)
            return null;
        int switchUnitNum = data.length / switchUnitSize;
        int byteLen = switchUnitSize / 2;
        byte[] result = new byte[data.length];
        for (int i = 0; i < switchUnitNum; i++) {
            for (int j = 0; j < byteLen; j++) {
                result[(i + 1) * switchUnitSize - byteLen * 2 + j] = data[(i + 1) * switchUnitSize - byteLen + j];
                result[(i + 1) * switchUnitSize - byteLen + j] = data[(i + 1) * switchUnitSize - byteLen * 2 + j];
            }
        }
        return result;
    }

    public static byte[] byteReverse(byte[] data) {
        if (data == null) {
            return null;
        }
        byte[] result = new byte[data.length];
        for (int i = 0; i < data.length; i++) {
            result[i] = data[data.length - i - 1];
        }
        return result;
    }

    /**
     * 字节数组转换为ASCII码
     *
     * @param b
     * @return
     */
    public static String byteToAscii(byte[] b) {

        String s = new String(b);

        char[] chars = s.toCharArray(); //把字符中转换为字符数组

        String temp = "";

        for (int i = 0; i < chars.length; i++) {//输出结果

            temp = temp + chars[i];
        }
        try {
            //temp = new String(temp.getBytes("utf-8"), "utf-8");
            String temps = changeCharset(temp, US_ASCII, UTF_8);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return temp;
    }

    public static final String US_ASCII = "US-ASCII";
    /**
     * 8 位 UCS 转换格式
     */
    public static final String UTF_8 = "UTF-8";

    /**
     * 将Ascii转换成中文字符串
     */
    /**
     * 字符串编码转换的实现方法
     *
     * @param str        待转换编码的字符串
     * @param newCharset 目标编码
     * @return
     * @throws UnsupportedEncodingException
     */
    public String changeCharset(String str, String newCharset)
            throws UnsupportedEncodingException {
        if (str != null) {
            //用默认字符编码解码字符串。
            byte[] bs = str.getBytes();
            //用新的字符编码生成字符串
            return new String(bs, newCharset);
        }
        return null;
    }

    /**
     * 字符串编码转换的实现方法
     *
     * @param str        待转换编码的字符串
     * @param oldCharset 原编码
     * @param newCharset 目标编码
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String changeCharset(String str, String oldCharset, String newCharset)
            throws UnsupportedEncodingException {
        if (str != null) {
            //用旧的字符编码解码字符串。解码可能会出现异常。
            byte[] bs = str.getBytes(oldCharset);
            //用新的字符编码生成字符串
            return new String(bs, newCharset);
        }
        return null;
    }


    /**
     * AscII码转换为字节数组
     *
     * @param str
     * @return
     */
    public static byte[] asciiToByte(String str) {
        try {
            byte[] tBytes = str.getBytes("US-ASCII");
            return tBytes;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static boolean byteArrayCompare(byte[] b1, byte[] b2) {
        if (null == b1 || null == b2) {
            return false;
        } else if (b1.length != b2.length) {
            return false;
        } else {
            for (int i = 0; i < b1.length; i++) {
                if (b1[i] != b2[i]) {
                    return false;
                }
            }
            return true;
        }
    }


    public static String byteArray2HexString(byte[] b, boolean flag) {
        StringBuffer buffer = new StringBuffer();
        int temp = 0;

        for (int i = 0; i < b.length; i++) {
            if (b[i] < 0) {
                temp = 256 + b[i];
            } else {
                temp = b[i];
            }

            String ts = Integer.toHexString(temp);
            if (ts.length() == 1) {
                if (flag) {
                    buffer.append("0" + ts + " ");
                } else {
                    buffer.append("0" + ts);
                }
            } else {
                if (flag) {
                    buffer.append(ts + " ");
                } else {
                    buffer.append(ts);
                }
            }
        }
        return buffer.toString();
    }

    /**
     * 十六进制字符串->字节数组
     *
     * @param hexString
     * @return
     */
    public static byte[] hexStringTobyteArray(String hexString) {
        int length = hexString.length();
        if (length % 2 != 0) {
            hexString = "0" + hexString;
            length = hexString.length();
        }
        byte[] b = new byte[length / 2];

//        BigInteger bigInteger = new BigInteger(hexString, 16);
//        byte[] bytes = toByteArray(bigInteger);
//        Log.e(TAG,"十六进制字符串->字节数组转换:"+bigInteger);
//        bytes=new byte[length / 2];
//        for (int i = 0; i < length / 2; i++) {
//            bytes[i] = (byte) ((int) Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16));
//        }

        for (int i = 0; i < length / 2; i++) {
            //  BigInteger bigInteger = new BigInteger(hexString.substring(2 * i, 2 * i + 2), 16);
//            b[i] = (byte) ((BigInteger) bigInteger);
            //   b[i] = (byte) ((BigInteger) bigInteger);
            // b[i] = fromBigInteger(bigInteger,  length / 2);
            b[i] = (byte) ((int) Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16));
        }


        return b;
    }



    public static byte[] toByteArray(BigInteger bi) {
        byte[] array = bi.toByteArray();
//        if (array[0] == 0) {
//            byte[] tmp = new byte[array.length - 1];
//            System.arraycopy(array, 1, tmp, 0, tmp.length);
//            array = tmp;
//        }
        byte[] tmp = new byte[array.length - 1];
        System.arraycopy(array, 1, tmp, 0, tmp.length);
        array = tmp;
        return array;
    }

    /**
     * 去掉16进制字符串前面的0X
     *
     * @param hexString
     * @return
     */
    public static String remove0x(String hexString) {
        if (hexString.toUpperCase().startsWith("0X")) {
            hexString = hexString.substring(2);
        }
        return hexString;
    }



    /**
     * IEEE754
     *
     * @param a
     * @return
     */
    public static byte[] floatToBytes(float a) {
        byte[] data = new byte[4];
        if (a == 0) {
            for (int i = 0; i < 4; i++) {
                data[i] = 0x00;
            }
            return data;
        }
        Integer[] intdata = {0, 0, 0, 0};
        a = Math.abs(a);
        // 首先将浮点数转化为二进制浮点数
        float floatpart = a % 1;
        int intpart = (int) (a / 1);

        System.out.println(intpart + " " + floatpart);
        // 将整数部分化为2进制,并转化为string类型
        String intString = "";
        String floatString = "";
        String result = "";
        String subResult = "";
        int zhishu = 0;
        if (intpart == 0) {
            intString += "0";
        }
        while (intpart != 0) {
            intString = intpart % 2 + intString;
            intpart = intpart / 2;
        }
        while (floatpart != 0) {
            floatpart *= 2;
            if (floatpart >= 1) {
                floatString += "1";
                floatpart -= 1;
            } else {
                floatString += "0";
            }

        }

        result = intString + floatString;
        System.out.println(intString + "." + floatString);
        intpart = (int) (a / 1);
        if (intpart > 0) {// 整数部分肯定有1,且以1开头..这样的话,小数点左移
            zhishu = intString.length() - 1;
        } else {// 整数位为0,右移
            for (int i = 0; i < floatString.length(); i++) {
                zhishu--;
                if (floatString.charAt(i) == '1') {
                    break;
                }
            }
            // while(floatString.charAt(index)){}
        }
        // 对指数进行移码操作

        if (zhishu >= 0) {
            subResult = result.substring(intString.length() - zhishu);
        } else {
            subResult = floatString.substring(-zhishu);
        }
        zhishu += 127;
        if (subResult.length() <= 7) {// 若长度

            for (int i = 0; i < 7; i++) {
                if (i < subResult.length()) {
                    intdata[1] = intdata[1] * 2 + subResult.charAt(i) - '0';
                } else {
                    intdata[1] *= 2;
                }

            }

            if (zhishu % 2 == 1) {// 如果质数是奇数,则需要在这个最前面加上一个‘1’
                intdata[1] += 128;
            }
            data[1] = intdata[1].byteValue();
        } else if (subResult.length() <= 15) {// 长度在(7,15)以内
            int i = 0;
            for (i = 0; i < 7; i++) {// 计算0-7位,最后加上第一位
                intdata[1] = intdata[1] * 2 + subResult.charAt(i) - '0';
            }
            if (zhishu % 2 == 1) {// 如果质数是奇数,则需要在这个最前面加上一个‘1’
                intdata[1] += 128;
            }
            data[1] = intdata[1].byteValue();

            for (i = 7; i < 15; i++) {// 计算8-15位
                if (i < subResult.length()) {
                    intdata[2] = intdata[2] * 2 + subResult.charAt(i) - '0';
                } else {
                    intdata[2] *= 2;
                }

            }
            data[2] = intdata[2].byteValue();
        } else {// 长度大于15
            int i = 0;
            for (i = 0; i < 7; i++) {// 计算0-7位,最后加上第一位
                intdata[1] = intdata[1] * 2 + subResult.charAt(i) - '0';
            }
            if (zhishu % 2 == 1) {// 如果质数是奇数,则需要在这个最前面加上一个‘1’
                intdata[1] += 128;
            }
            data[1] = intdata[1].byteValue();

            for (i = 7; i < 15; i++) {// 计算8-15位
                intdata[2] = intdata[2] * 2 + subResult.charAt(i) - '0';
            }
            data[2] = intdata[2].byteValue();

            for (i = 15; i < 23; i++) {// 计算8-15位
                if (i < subResult.length()) {
                    intdata[3] = intdata[3] * 2 + subResult.charAt(i) - '0';
                } else {
                    intdata[3] *= 2;
                }

            }
            data[3] = intdata[3].byteValue();
        }

        intdata[0] = zhishu / 2;
        if (a < 0) {
            intdata[0] += 128;
        }
        data[0] = intdata[0].byteValue();
        byte[] data2 = new byte[4];// 将数据转移,目的是倒换顺序
        for (int i = 0; i < 4; i++) {
            data2[i] = data[3 - i];
        }
        return data2;
    }

 /*   public static String ipV4(byte[] b) {
        String ip = "";
        for (int i = 0; i < b.length; i++) {
            int temp = 0;
            if (b[i] < 0)
                temp = 256 + b[i];
            else
                temp = b[i];
            ip = ip + temp + ".";
        }
        if (StringUtils.isNotBlank(ip)) {
            ip = ip.substring(0, ip.length() - 1);
        }
        return ip;
    }*/

    /**
     * Short Int转byte[]
     *
     * @param s
     * @return
     */
    public static byte[] shortToByteArray(short s) {
        byte[] shortBuf = new byte[2];
        for (int i = 0; i < 2; i++) {
            int offset = (shortBuf.length - 1 - i) * 8;
            shortBuf[i] = (byte) ((s >>> offset) & 0xFF);
        }
        return shortBuf;
    }

    /**
     * byte[]转Short Int
     *
     * @param b
     * @return
     */
    public static int byteArrayToShort(byte[] b) {
        return (b[0] << 8)
                + (b[1] & 0xFF);
    }

    /**
     * Object转double
     *
     * @param sma
     * @return
     */
    public static double objToDouble(Object sma) {
        double amount = 0.0;
        if (sma instanceof Integer) {
            amount = (Integer) sma / 1.0;
        } else if (sma instanceof String) {
            amount = Double.parseDouble((String) sma);
        } else {
            amount = (double) sma;
        }
        return amount;
    }

    /**
     * int转byte[]
     *
     * @param n
     * @return
     */
    public static byte[] intToBytes2(int n) {
        byte[] b = new byte[4];

        for (int i = 0; i < 4; i++) {
            b[i] = (byte) (n >> (24 - i * 8));

        }
        return b;
    }

    /**
     * byte[]转int
     *
     * @param b
     * @return
     */
    public static int byteToInt2(byte[] b) {
        int mask = 0xff;
        int temp = 0;
        int n = 0;
        for (int i = 0; i < b.length; i++) {
            n <<= 8;
            temp = b[i] & mask;
            n |= temp;
        }
        return n;
    }

    /**
     * int 转 hex ,高位在前
     *
     * @param inn int
     * @return hex
     */
    public static String IntToHexReversed(int inn) {
        return toHexString(byteReverse(intToBytes2(inn)));

    }

    /**
     * int 转 hex ,高位在前
     *
     * @param inn int
     * @return hex
     */
    public static String intToHex(int inn) {
        return toHexString(intToBytes2(inn));

    }

    /**
     * short 转 hex ,高位在前
     *
     * @param inn int
     * @return hex
     */
    public static String shortToHex(short inn) {
        return toHexString(shortToByteArray(inn));

    }

    /**
     * int 转 hex ,高位在前
     *
     * @param hex hex
     * @return ascii2 string
     */
    public static String hexString2Ascii(String hex) {

        return byteToAscii(hexStringTobyteArray(hex));
    }

    /**
     * ascii 转 hex ,高位在前
     *
     * @param asciiStr String
     * @return hex string
     */
    public static String asciiToHex(String asciiStr) {
        char[] chars = asciiStr.toCharArray();
        StringBuilder hex = new StringBuilder();
        for (char ch : chars) {
            hex.append(Integer.toHexString((int) ch));
        }
        return hex.toString();
    }


    /**
     * 将BCD码转成String
     *
     * @param b byte []
     * @return
     */
    public static String bcdToString(byte[] b) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            int h = ((b[i] & 0xff) >> 4) + 48;
            sb.append((char) h);
            int l = (b[i] & 0x0f) + 48;
            sb.append((char) l);
        }

        return sb.toString();
    }


    /**
     * @功能: BCD码转为10进制串(阿拉伯数据)
     * @参数: BCD码
     * @结果: 10进制串
     */
    public static String bcd2Str(byte[] bytes) {
        StringBuffer temp = new StringBuffer(bytes.length * 2);
        for (int i = 0; i < bytes.length; i++) {
            temp.append((byte) ((bytes[i] & 0xf0) >>> 4));
            temp.append((byte) (bytes[i] & 0x0f));
        }
        return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp
                .toString().substring(1) : temp.toString();
    }

    public static short BcdToHex(short data) {
        short temp;

        temp = (short) ((data >> 4) * 10 + (data & 0x0f));
        return temp;
    }



    /**
     * 字符串转换为16进制字符串
     *
     * @param s
     * @return
     */
    public static String stringToHexString(String s) {
        String str = "";
        for (int i = 0; i < s.length(); i++) {
            int ch = (int) s.charAt(i);
            String s4 = Integer.toHexString(ch);
            str = str + s4;
        }
        return str;
    }

    /**
     * 16进制字符串转换为字符串
     *
     * @param s
     * @return
     */
    public static String hexStringToString(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++) {
            try {
                baKeyword[i] = (byte) (0xff & Integer.parseInt(
                        s.substring(i * 2, i * 2 + 2), 16));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "gbk");
            new String();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    public static String rev(String ox) {
        String s = ox.substring(2);
        byte b[] = s.getBytes();
        byte result[] = new byte[b.length];
        for (int i = b.length - 1, j = 0; i >= 0; i--, j++)
            result[j] = b[i];
        return new String(result);
    }

    /**
     * 10进制转16进制高位在前地位在后
     *
     * @param var0
     * @return
     */
    public static String lowHigh(int var0) {
        int var1 = 1;
        int var2 = var0 >> 8;
        int var3 = var0 & 255;
        String var4 = Integer.toHexString(var2);
        String var5 = Integer.toHexString(var3);
        if (var4.length() > 2) {
            do {
                if (var1 > 1) {
                    var2 >>= 8;
                }
                var4 = Integer.toHexString(var2 >> 8);
                var5 = var5 + Integer.toHexString(var2 & 255);
                ++var1;
            } while (var4.length() > 2);
        }
        if (var4.length() < 2) {
            var4 = "0" + var4;
        }
        if (var5.length() < 2) {
            var5 = "0" + var5;
        }
        return var5 + var4;
    }


    /**
     * 10进制的数转换为16进制字节,并高位在前,低位在后
     *
     * @param dec
     * @return
     */
    public static String decToHex(int dec) {
        String hex = "";
        while (dec != 0) {
            String h = Integer.toString(dec & 0xff, 16);
            if ((h.length() & 0x01) == 1) {
                h = '0' + h;
            }
            hex = hex + h;
            dec = dec >> 8;
        }
        return hex;
    }

    /**
     * 10进制的数转换为16进制字节,并高位在前,低位在后
     *
     * @param dec
     * @return
     */
    public static String decLongToHex(long dec) {
        String hex = "";
        while (dec != 0) {
            String h = Long.toString(dec & 0xff, 16);
            if ((h.length() & 0x01) == 1) {
                h = '0' + h;
            }
            hex = hex + h;
            dec = dec >> 8;
        }
        return hex;
    }

    public void test(String ox) {

        String temp = "94 01 00 00 60 10";
        List<String> list = Arrays.asList(ox.split(""));
        Collections.reverse(list);

        StringBuffer stringBuffer = new StringBuffer();
        for (String string : list) {
            stringBuffer.append(string);
            stringBuffer.append(" ");
        }
        temp = stringBuffer.toString();
        System.out.println(temp);//10 60 00 00 01 94

    }

    /**
     * 十六进制字符串转换成字符串
     *
     * @param hexStr
     * @return String
     */
    public static String hexStr2Str(String hexStr) {

        String str = "0123456789ABCDEF";
        char[] hexs = hexStr.toCharArray();
        byte[] bytes = new byte[hexStr.length() / 2];
        int n;
        for (int i = 0; i < bytes.length; i++) {
            n = str.indexOf(hexs[2 * i]) * 16;
            n += str.indexOf(hexs[2 * i + 1]);
            bytes[i] = (byte) (n & 0xff);
        }
        return new String(bytes);
    }

    /**
     * 16进制转 字符串 低字节在前,高字节在后
     *
     * @param str
     * @return
     */
    public static String reverse(String str) {
        int length = str.length();
        if ((length & 1) == 1) {
            str = "0" + str;
            length = str.length();
        }
        String string = "";
        for (int i = length / 2 - 1; i >= 0; i--) {
            string += str.substring(2 * i, 2 * i + 2);
        }
        return string;
    }


    /**
     * long 转 hex ,高位在前
     *
     * @param inn int
     * @return hex
     */
    public static String LongToHexReversed(Long inn) {
        return toHexString(byteReverse(longToBytes2(inn)));

    }


    /**
     * long 转 hex ,高位在前
     *
     * @param inn int
     * @return hex
     */
    public static String longToHex(Long inn) {
        return toHexString(longToBytes2(inn));

    }

    /**
     * long转byte[]
     *
     * @param n
     * @return
     */
    public static byte[] longToBytes2(Long n) {
        byte[] b = new byte[4];

        for (int i = 0; i < 4; i++) {
            b[i] = (byte) (n >> (24 - i * 8));

        }
        return b;
    }

    /**
     * 十六进制字符串->字节数组
     *
     * @param hexString
     * @return
     */
    public static byte[] hexString2byteArray(String hexString) {
        int length = hexString.length();

        byte[] b = new byte[length / 2];

        for (int i = 0; i < length / 2; i++) {
            b[i] = (byte) ((int) Integer.valueOf(hexString.substring(2 * i,
                    2 * i + 2), 16));
        }

        return b;
    }

    /**
     * 16进制转10进制
     *
     * @param bytes
     * @return
     */
    public static String bytes2hex03(byte[] bytes) {
        final String HEX = "0123456789abcdef";
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        for (byte b : bytes) {
            sb.append(HEX.charAt((b >> 4) & 0x0f));
            sb.append(HEX.charAt(b & 0x0f));
        }

        return sb.toString();
    }


    /**
     * 10进制转16进制
     *
     * @param num
     * @param totalLenght 需要的字符串总长度
     * @return
     */
    public String toHex(int num, int totalLenght) {
        String str = Integer.toHexString(num);
        str = splicingZero(str, totalLenght);
        return str;
    }

    public static String toHex(long num, int totalLenght) {
        String str = Long.toHexString(num);
        str = splicingZero(str, totalLenght);
        return str;
    }

    /**
     * 字符串前面补零操作
     *
     * @param str         字符串本体
     * @param totalLenght 需要的字符串总长度
     * @return
     */
    public static String splicingZero(String str, int totalLenght) {
        int strLenght = str.length();
        String strReturn = str;
        for (int i = 0; i < totalLenght - strLenght; i++) {
            strReturn = "0" + strReturn;
        }
        return strReturn;
    }


    /**
     * byte[]转十六进制
     *
     * @param bytes
     * @return
     */
    public String bytesTohex(byte[] bytes) {
        StringBuilder hex = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            byte b = bytes[i];
            boolean flag = false;
            if (b < 0) {
                flag = true;
            }
            int absB = Math.abs(b);
            if (flag) {
                absB = absB | 0x80;
            }
            System.out.println(absB & 0xFF);
            String tmp = Integer.toHexString(absB & 0xFF);
            if (tmp.length() == 1) { //转化的十六进制不足两位,需要补0
                hex.append("0");
            }
            hex.append(tmp.toLowerCase());
        }
        return hex.toString();
    }

    /**
     * 十六进制转byte[]
     *
     * @param hex
     * @return
     */
    public static byte[] hexTobytes(String hex) {
        byte[] bytes = new byte[hex.length() / 2];
        for (int i = 0; i < hex.length(); i = i + 2) {
            String subStr = hex.substring(i, i + 2);
            boolean flag = false;
            int intH = Integer.parseInt(subStr, 16);
            if (intH > 127) {
                flag = true;
            }
            if (intH == 128) {
                intH = -128;
            } else if (flag) {
                intH = 0 - (intH & 0x7F);
            }
            byte b = (byte) intH;
            bytes[i / 2] = b;
        }
        return bytes;
    }

    //10进制转16进制
    public static String IntToHex(long n) {
        char[] ch = new char[20];
        int nIndex = 0;
        while (true) {
            long m = n / 16;
            long k = n % 16;
            if (k == 15) {
                ch[nIndex] = 'f';
            } else if (k == 14) {
                ch[nIndex] = 'e';
            } else if (k == 13) {
                ch[nIndex] = 'd';
            } else if (k == 12) {
                ch[nIndex] = 'c';
            } else if (k == 11) {
                ch[nIndex] = 'b';
            } else if (k == 10) {
                ch[nIndex] = 'a';
            } else {
                ch[nIndex] = (char) ('0' + k);
            }
            nIndex++;
            if (m == 0) {
                break;
            }
            n = m;
        }
        StringBuffer sb = new StringBuffer();
        sb.append(ch, 0, nIndex);
        sb.reverse();
        String strHex = new String("0x");
        strHex += sb.toString();
        return strHex;
    }

    //16进制转10进制
    public static Long HexToInt(String strHex) {
        long nResult = 0;
        if (!IsHex(strHex)) {
            return nResult;
        }
        String str = strHex.toUpperCase();
        if (str.length() > 2) {
            if (str.charAt(0) == '0' && str.charAt(1) == 'X') {
                str = str.substring(2);
            }
        }
        int nLen = str.length();
        for (int i = 0; i < nLen; ++i) {
            char ch = str.charAt(nLen - i - 1);
            try {
                nResult += (GetHex(ch) * GetPower(16, i));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return nResult;
    }

    //计算16进制对应的数值
    public static int GetHex(char ch) throws Exception {
        if (ch >= '0' && ch <= '9') {
            return (int) (ch - '0');
        }
        if (ch >= 'a' && ch <= 'f') {
            return (int) (ch - 'a' + 10);
        }
        if (ch >= 'A' && ch <= 'F') {
            return (int) (ch - 'A' + 10);
        }
        throw new Exception("error param");
    }

    //计算幂
    public static long GetPower(long nValue, long nCount) throws Exception {
        if (nCount < 0) {
            throw new Exception("nCount can't small than 1!");
        }
        if (nCount == 0) {
            return 1;
        }
        long nSum = 1;
        for (long i = 0; i < nCount; ++i) {
            nSum = nSum * nValue;
        }
        return nSum;
    }

    //判断是否是16进制数
    public static boolean IsHex(String strHex) {
        int i = 0;
        if (strHex.length() > 2) {
            if (strHex.charAt(0) == '0' && (strHex.charAt(1) == 'X' || strHex.charAt(1) == 'x')) {
                i = 2;
            }
        }
        for (; i < strHex.length(); ++i) {
            char ch = strHex.charAt(i);
            if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) {
                continue;
            }
            return false;
        }
        return true;
    }

    /**
     *      * 十六进制字符串校验(不够4个长度补齐0)
     *      * @param lockAddress
     *      * @return
     *      
     */
    public static String checkValidityHex(String hex, int hexLengh) {

        StringBuffer s1 = new StringBuffer(hex);
        int index;
        for (index = 2; index < s1.length(); index += 3) {
            s1.insert(index, ',');
        }
        String[] array = s1.toString().split(",");
        String[] swapOrder = (array);
        StringBuffer s2 = new StringBuffer();
        for (String str : swapOrder) {
            s2.append(str);
        }
        String s3 = s2.toString();
        if (s3.length() != 4 || s3.length() != 8) {
            int count = (hexLengh - s3.length());
            for (int i = 0; i < count; i++) {
                s3 = "0" + s3;
            }
        }
        return s3;

    }

    public int hexToIntArraged(String workVolumeDose) {
        byte[] workVolumeArray = hexStringTobyteArray(workVolumeDose);
        return byteToInt2(byteReverse(workVolumeArray));
    }

//    public int hexToIntArraged( String data) {
//        byte[] byteDataArray = HexUtils.hexStringTobyteArray(data);
//        return HexUtils.byteToInt2(byteReverse(byteDataArray));
//    }


    /**
     * 16进制高低位转换(低位在前高位在后) reverseHighToLowHex
     *
     * @param hex
     * @return
     */

    public static String reverseHighToLowHex(final String hex) {
        final char[] charArray = hex.toCharArray();
        final int length = charArray.length;
        final int times = length / 2;
        for (int c1i = 0; c1i < times; c1i += 2) {
            final int c2i = c1i + 1;
            final char c1 = charArray[c1i];
            final char c2 = charArray[c2i];
            final int c3i = length - c1i - 2;
            final int c4i = length - c1i - 1;
            charArray[c1i] = charArray[c3i];
            charArray[c2i] = charArray[c4i];
            charArray[c3i] = c1;
            charArray[c4i] = c2;
        }
        return new String(charArray);
    }

    /**
     * 16进制高低位转换(高位在前低位在后) reverseLowToHighHex
     *
     * @param hex
     * @return
     */
    public static String reverseLowToHighHex(final String hex) {
        final char[] charArray = hex.toCharArray();
        final int length = charArray.length;
        final int times = length / 2;
        for (int c1i = 0; c1i < times; c1i += 2) {
            final int c2i = c1i + 1;
            final char c1 = charArray[c1i];
            final char c2 = charArray[c2i];
            final int c3i = length - c1i - 2;
            final int c4i = length - c1i - 1;
//            charArray[c1i] = charArray[c3i];
//            charArray[c2i] = charArray[c4i];
//            charArray[c3i] = c2;
//            charArray[c4i] = c1;


            charArray[c4i] = charArray[c3i];
            charArray[c3i] = charArray[c4i];
            charArray[c2i] = c1;
            charArray[c1i] = c2;
        }
        return new String(charArray);
    }

    public static String lowHigh2(int var0) {
        int var1 = 1;
        int var2 = var0 >> 8;
        int var3 = var0 & 255;
        String var4 = Integer.toHexString(var2);
        String var5 = Integer.toHexString(var3);
        if (var4.length() > 2) {
            do {
                if (var1 > 1) {
                    var2 >>= 8;
                }
                var4 = Integer.toHexString(var2 >> 8);
                var5 = var5 + Integer.toHexString(var2 & 255);
                ++var1;
            } while (var4.length() > 2);
        }
        if (var4.length() < 2) {
            var4 = "0" + var4;
        }
        if (var5.length() < 2) {
            var5 = "0" + var5;
        }
        return var5 + var4;
    }

    /**
     * 数字参数返回(4字节、8字节都适用)
     *
     * @param hex
     * @return
     */
    public static int getHexDataToInt(String hex) {
        int digit = -1;
        int a;
        BigInteger bi;
        int length = hex.length();
        if (length == 4) {
            String str = hex.substring(2, 3);
            BigInteger data = new BigInteger(str, 16);
            digit = data.intValue();
        }

        String reverseLowToHighHex = reverseHighToLowHex(hex);
        if (length == 4 && digit >= 8) {
            //16进制转10进制
            bi = new BigInteger("ffff" + reverseLowToHighHex, 16);
        } else {
            //16进制转10进制
            bi = new BigInteger(reverseLowToHighHex, 16);
        }
        a = bi.intValue();
        return a;
    }

    /**
     * 设置数字参数
     *
     * @param num           数字
     * @param lenght        hex 长度  4或是8
     * @param magnification 放大倍数
     * @return
     */
    public static String setHexData(int num, int lenght, int magnification) {

        BigDecimal result = (new BigDecimal(num));
        BigDecimal results = result.multiply(BigDecimal.valueOf(magnification));
        Log.e(TAG, "setHexData results !=   " + results);

        //10进制转16进制
        String hex2 = Integer.toHexString((results.intValue()));
        Log.e(TAG, "setHexData hex2 !=   " + hex2);

        String checkValidityHex = checkValidityHex(hex2, lenght);
        Log.e(TAG, "setHexData checkValidityHex !=   " + checkValidityHex);
        if (checkValidityHex.length() > lenght) {
            checkValidityHex = checkValidityHex.substring(lenght);
        }
        String reverseHighToLowHex = reverseHighToLowHex(checkValidityHex);

        Log.e(TAG, "setHexData reverseHighToLowHex !=   " + reverseHighToLowHex);

        String data = "";
        if (lenght == 8) {
            int len = 8 - reverseHighToLowHex.length();
            for (int i = 0; i < len; i++) {
                reverseHighToLowHex += "0";
            }
        }
        return reverseHighToLowHex;
    }

    /**
     * 整数Hex设置
     *
     * @param portResult
     * @param magnification
     * @return
     */

    public static String setHexDataResult(String portResult, int magnification) {
        String data = "";
        data = HexUtils.decToHex(Integer.parseInt(portResult) * magnification);
        int len = 8 - portResult.length();
        for (int i = 0; i < len; i++) {
            data += "0";
        }
        return data;
    }

    /**
     * 强制转化成BigDecimal保证精度
     *
     * @param num           数字字符串
     * @param magnification 1*100的倍数
     * @return
     */

    public static BigDecimal setBigDecimal(String num, int magnification) {
        BigDecimal result = (new BigDecimal(num));
        Log.e(TAG, "results setBigDecimal !=   " + result);
        BigDecimal results = result.multiply(BigDecimal.valueOf(magnification));
        return results;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值