zoukankan      html  css  js  c++  java
  • 进制转换HEX-->String工具类

    package com.panchan.tsmese.utils;
    
    import java.math.BigInteger;
    import java.util.BitSet;
    
    /**
     * @Description:TODO
     * @version 1.0
     * @since JDK1.8
     * @author 
     * @Created on 2018年9月25日
     */
    
    public class HexStringUtils {
    
        private static final char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
                'F' };
    
        /**
         * Convert input Byte[] to HexString from offset as length including space.
         */
        public static String byteToHexString(byte d[], int offset, int len) {
            String result = new String();
            int to = offset + len;
            for (int i = offset; i < to; i++)
                result = result + (hexifyByte(d[i]) + " ");
            return result;
        }
    
        /** Convert input Byte[] to HexString from offset as length. */
        public static String byteToHexString(byte d[], int offset, int len, boolean spaced) {
            String result = new String();
            int to = offset + len;
            for (int i = offset; i < to; i++) {
                result = result + hexifyByte(d[i]);
                if (spaced)
                    result = result + " ";
            }
            return result;
        }
    
        /** Convert input Byte[] to HexString. */
        public static String byteToHexString(byte[] d) {
            return new String(encodeHex(d));
            // return byteToHexString(d, 0, d.length, false);
        }
    
        /** Convert input Byte[] to HexString. */
        public static String byteToHexString(byte[] d, boolean spaced) {
            return byteToHexString(d, 0, d.length, spaced);
        }
    
        /** Convert input HexStrings to Byte[]. */
        public static byte[] parseHexString(String s) throws Exception {
            int stringLen = s.length();
            byte[] temp = new byte[stringLen];
            int resultLength = 0;
            int nibble = 0;
            byte nextByte = 0;
            for (int i = 0; i < stringLen; i++) {
                char c = s.charAt(i);
                byte b = (byte) Character.digit(c, 16);
                if (b == -1) {
                    if (!Character.isWhitespace(c))
                        throw new Exception("Not HexString character: " + c);
                    continue;
                }
                if (nibble == 0) {
                    nextByte = (byte) (b << 4);
                    nibble = 1;
                } else {
                    nextByte |= b;
                    temp[resultLength++] = nextByte;
                    nibble = 0;
                }
            } // for
            if (nibble != 0) {
                throw new Exception("Not enough characters to fill in a byte");
            } else {
                byte[] result = new byte[resultLength];
                System.arraycopy(temp, 0, result, 0, resultLength);
                return result;
            }
        }
    
        public static byte[] asciiToByte(String str)
        // "ABC..." -> [41,42,43,..]
        {
            if (str == null || str.length() == 0)
                return new byte[0];
    
            int len = str.length();
            byte[] data = new byte[len];
            for (int i = 0; i < len; i++)
                data[i] = (byte) str.charAt(i);
            return data;
        }
    
        public static byte[] leftPaddingBytes(byte[] buffer, byte padding, byte[] source) throws Exception {
            if (buffer.length <= source.length)
                throw new Exception("Not enough buffer to fill in a padding byte");
            int paddingLength = buffer.length - source.length;
    
            byte[] padBlock = new byte[paddingLength];
    
            for (int i = 0; i < paddingLength; i++) {
                padBlock[i] = padding;
            }
    
            System.arraycopy(padBlock, 0, buffer, 0, paddingLength);
            System.arraycopy(source, 0, buffer, paddingLength, source.length);
            return buffer;
        }
    
        public static byte[] rightPaddingBytes(byte[] buffer, byte padding, byte[] source) throws Exception {
            if (buffer.length <= source.length)
                throw new Exception("Not enough buffer to fill in a padding byte");
            int paddingLength = buffer.length - source.length;
    
            byte[] padBlock = new byte[paddingLength];
    
            for (int i = 0; i < paddingLength; i++) {
                padBlock[i] = padding;
            }
    
            System.arraycopy(source, 0, buffer, 0, source.length);
            System.arraycopy(padBlock, 0, buffer, source.length, paddingLength);
    
            return buffer;
        }
    
        public static final int bytesToSingedInt(byte abyte0[], int offset, int length) {
            int result = 0;
            for (int i = 0; i < length; i++)
                result = result << 8 | abyte0[i + offset] & 0xff;
    
            return result;
        }
    
        public static final int bytesToSingedInt(byte abyte0[]) {
            return bytesToSingedInt(abyte0, 0, abyte0.length);
        }
    
        /**
         * Convert integer value to hexadecimal byte presentation
         * 
         * @param val
         *            Value
         * @return 2 digit hexadecimal string
         */
        public static String hexifyByte(int val) {
            return "" + digits[(val >>> 4) & 0x0F] + digits[val & 0x0F];
        }
    
        /**
         * Convert byte value to hexadecimal byte presentation
         * 
         * @param val
         *            Value
         * @return 2 digit hexadecimal string
         */
        public static String hexifyByte(byte val) {
            return hexifyByte((int) val & 0xFF);
        }
    
        /**
         * Convert int value to hexadecimal short presentation
         * 
         * @param val
         *            Value
         * @return 4 digit hexadecimal string
         */
        public static String hexifyShort(int val) {
            return hexifyByte((val >>> 8) & 0xFF) + hexifyByte(val & 0xFF);
        }
    
        /**
         * Convert int value to hexadecimal int presentation
         * 
         * @param val
         *            Value
         * @return 8 digit hexadecimal string
         */
        public static String hexifyInt(int val) {
            return hexifyShort((val >> 16) & 0xFFFF) + hexifyShort(val & 0xFFFF);
        }
    
        /**
         * Compares an array from the specified source array
         * 
         * @param src
         *            source byte array.
         * @param srcOff
         *            offset within source byte array to start compare.
         * @param dest
         *            destination byte array.
         * @param destOff
         *            offset within destination byte array to start compare.
         * @param len
         *            byte length to be compared.
         * @return boolean result of the comparison
         */
        public static boolean arrayCompare(byte[] src, int srcOff, byte[] dest, int destOff, int len) {
            for (int i = 0; i < len; i++)
                if (src[srcOff + i] != dest[destOff + i])
                    return false;
            return true;
        }
    
        /**
         * Compares an array from the specified source array
         * 
         * @param src
         *            source byte array.
         * @param dest
         *            destination byte array.
         * @return boolean result of the comparison
         */
        public static boolean arrayCompare(byte[] src, byte[] dest) {
            int srcLen = src.length;
            if (srcLen != dest.length)
                return false;
            else
                return arrayCompare(src, 0, dest, 0, srcLen);
        }
    
        /**
         * Dump buffer in hexadecimal format with offset and character codes
         * 
         * @param data
         *            Byte buffer
         * @param offset
         *            Offset into byte buffer
         * @param length
         *            Length of data to be dumped
         * @param widths
         *            Number of bytes per line
         * @param indent
         *            Number of blanks to indent each line
         * @return String containing the dump
         */
        public static String dump(byte[] data, int offset, int length, int widths, int indent) {
            StringBuffer buffer = new StringBuffer(80);
            int i, ofs, len;
            char ch;
    
            if ((data == null) || (widths == 0) || (length < 0) || (indent < 0))
                throw new IllegalArgumentException();
    
            while (length > 0) {
                for (i = 0; i < indent; i++)
                    buffer.append(' ');
    
                buffer.append(hexifyShort(offset));
                // buffer.append(" ");
                buffer.append("h: ");
    
                ofs = offset;
                len = widths < length ? widths : length;
    
                for (i = 0; i < len; i++, ofs++) {
                    buffer.append(digits[(data[ofs] >>> 4) & 0x0F]);
                    buffer.append(digits[data[ofs] & 0x0F]);
                    buffer.append(' ');
                }
    
                for (; i < widths; i++) {
                    buffer.append("   ");
                }
    
                buffer.append(' ');
                ofs = offset;
    
                for (i = 0; i < len; i++, ofs++) {
                    ch = (char) (data[ofs] & 0xFF);
                    if ((ch < 32) || ((ch >= 127) && (ch <= 0xA0)))
                        ch = '.';
                    buffer.append(ch);
                }
    
                buffer.append('
    ');
    
                offset += len;
                length -= len;
            }
            return buffer.toString();
        }
    
        /**
         * Dump buffer in hexadecimal format with offset and character codes
         * 
         * @param data
         *            Byte buffer
         * @param offset
         *            Offset into byte buffer
         * @param length
         *            Length of data to be dumped
         * @param widths
         *            Number of bytes per line
         * @return String containing the dump
         */
        public static String dump(byte[] data, int offset, int length, int widths) {
            return dump(data, offset, length, widths, 0);
        }
    
        /**
         * Dump buffer in hexadecimal format with offset and character codes. Output
         * 16 bytes per line
         * 
         * @param data
         *            Byte buffer
         * @param offset
         *            Offset into byte buffer
         * @param length
         *            Length of data to be dumped
         * @return String containing the dump
         */
        public static String dump(byte[] data, int offset, int length) {
            return dump(data, offset, length, 16, 0);
        }
    
        /**
         * Dump buffer in hexadecimal format with offset and character codes
         * 
         * @param data
         *            Byte buffer
         * @return String containing the dump
         */
        public static String dump(byte[] data) {
            return dump(data, 0, data.length, 16, 0);
        }
    
        /**
         * Bitwise XOR between corresponding bytes
         * 
         * @param op1
         *            byteArray1
         * @param op2
         *            byteArray2
         * @return an array of length = the smallest between op1 and op2
         */
        public static byte[] xor(byte[] op1, byte[] op2) {
            byte[] result = null;
            // Use the smallest array
            if (op2.length > op1.length) {
                result = new byte[op1.length];
            } else {
                result = new byte[op2.length];
            }
            for (int i = 0; i < result.length; i++) {
                result[i] = (byte) (op1[i] ^ op2[i]);
            }
            return result;
        }
    
        public static byte[] longToByteArray(long input, int arrayLength) throws Exception {
            String tmp = Long.toHexString(input);
            if (tmp.length() % 2 != 0)
                tmp = "0" + tmp;
            byte[] tmpbuf = new byte[0];
            tmpbuf = HexStringUtils.parseHexString(tmp);
    
            if (tmpbuf.length > arrayLength)
                throw new Exception("input arrayLength small than output Array");
    
            byte[] buf = new byte[arrayLength];
            System.arraycopy(tmpbuf, 0, buf, arrayLength - tmpbuf.length, tmpbuf.length);
    
            return buf;
        }
    
        public static final BitSet bytesToBitSet(byte[] b) {
            int length = 8 * b.length;
            BitSet bs = new BitSet(length);
            for (int i = 0; i < b.length; i++) {
                for (int j = 0; j < 8; j++) {
                    // bs.set((b<0) ? 1 : 0);
                    if (b[i] < 0)
                        bs.set((i * 8) + j + 1);
                    else
                        bs.clear((i * 8) + j + 1);
                    b[i] <<= 1;
                }
            }
            return bs;
        }
    
        public static final BitSet byteToBitSet(byte b) {
            BitSet bs = new BitSet(8);
            for (int i = 0; i < 8; i++) {
                // bs.set((b<0) ? 1 : 0);
    
                if (b < 0)
                    bs.set(i + 1);
                else
                    bs.clear(i + 1);
    
                b <<= 1;
            }
    
            return bs;
        }
    
        public static byte[] bigIntegerToBytes(BigInteger big) {
            // BigInteger it = new BigInteger();
    
            byte[] bigBytes = big.toByteArray();
    
            if ((big.bitLength() % 8) == 0 && bigBytes.length != big.bitLength() / 8) {
                byte[] smallerBytes = new byte[big.bitLength() / 8];
                System.arraycopy(bigBytes, 1, smallerBytes, 0, smallerBytes.length);
                return smallerBytes;
            } else {
                return bigBytes;
            }
        }
    
        public static String leftZeroPad(String input, int digitNumber) {
            String out = "";
            if (input != null)
                out = input;
            if (digitNumber > out.length())
                for (; out.length() < digitNumber; out = "0" + out)
                    ;
            return out.toUpperCase();
        }
    
        public static String rightZeroPad(String input, int digitNumber) {
            String out = "";
            if (input != null)
                out = input;
            if (digitNumber > out.length())
                for (; out.length() < digitNumber; out = out + "0")
                    ;
            return out.toUpperCase();
        }
    
        public static final byte[] intToBytes(int i) {
            int j = (Integer.toHexString(i).length() + 1) / 2;
            byte abyte0[] = new byte[j];
            for (int k = 0; k < j; k++)
                abyte0[k] = (byte) (i >>> 8 * (j - 1 - k) & 0xff);
    
            return abyte0;
        }
    
        /**
         * Concatenates two byte arrays (array1 and array2)
         * 
         * @param array1
         * @param beginIndex1
         * @param length1
         * @param array2
         * @param beginIndex2
         * @param length2
         * @return the concatenated array
         */
    
        public static byte[] concat(byte[] array1, int beginIndex1, int length1, byte[] array2, int beginIndex2,
                int length2) {
            byte[] concatArray = new byte[length1 + length2];
            System.arraycopy(array1, beginIndex1, concatArray, 0, length1);
            System.arraycopy(array2, beginIndex2, concatArray, length1, length2);
            return concatArray;
        }
    
        public static byte[] concat(byte[] array1, byte[] array2) {
            return concat(array1, 0, array1.length, array2, 0, array2.length);
        }
    
        public static char[] encodeHex(byte[] data) {
    
            int l = data.length;
    
            char[] out = new char[l << 1];
    
            // two characters form the hex value.
            for (int i = 0, j = 0; i < l; i++) {
                out[j++] = digits[(0xF0 & data[i]) >>> 4];
                out[j++] = digits[0x0F & data[i]];
            }
    
            return out;
        }
    
        /** Convert input HexStrings to Byte[]. */
        public static byte[] hexStringToBytes(String hexString) {
            if (hexString == null || "".equals(hexString))
                return null;
            int stringLen = hexString.length();
            byte[] temp = new byte[stringLen];
            int resultLength = 0;
            int nibble = 0;
            byte nextByte = 0;
            for (int i = 0; i < stringLen; i++) {
                char c = hexString.charAt(i);
                byte b = (byte) Character.digit(c, 16);
                if (b == -1) {
                    if (!Character.isWhitespace(c))
                        throw new IllegalArgumentException("Not HexString character: " + c);
                    continue;
                }
                if (nibble == 0) {
                    nextByte = (byte) (b << 4);
                    nibble = 1;
                } else {
                    nextByte |= b;
                    temp[resultLength++] = nextByte;
                    nibble = 0;
                }
            } // for
            if (nibble != 0) {
                throw new IllegalArgumentException("odd number of characters.");
            } else {
                byte[] result = new byte[resultLength];
                System.arraycopy(temp, 0, result, 0, resultLength);
                return result;
            }
        }
    
        /** Convert input HexString to Byte. */
        public static byte hexStringToByte(String s) throws Exception {
            if (s == null)
                throw new RuntimeException("input String is null");
    
            int strLength = s.length();
            if (strLength == 1)
                s = "0" + s;
            else if (strLength > 2)
                s = s.substring(0, 2);
    
            byte[] result = new byte[1];
            result = hexStringToBytes(s);
            return result[0];
        }
    
        /** Convert input Byte to HexString. */
        public static String byteToHexString(byte b) {
            StringBuilder result = new StringBuilder();
            result.append(digits[b >> 4 & 0xf]).append(digits[b & 0xf]);
            return result.toString();
        }
    
        /** Convert input Byte[] to HexString from offset as length. */
        public static String bytesToHexString(byte d[], int offset, int len, boolean spaced) {
            StringBuilder result = new StringBuilder();
            int to = offset + len;
            for (int i = offset; i < to; i++) {
                result.append(byteToHexString(d[i]));
                if (spaced)
                    result.append(" ");
            }
            return result.toString();
        }
    
        /** Convert input Byte[] to HexString. */
        public static String bytesToHexString(byte[] d) {
            if (d == null)
                return null;
            return bytesToHexString(d, 0, d.length, false);
        }
    
        /** Convert input Byte[] to HexString. */
        public static String bytesToHexString(byte[] d, boolean spaced) {
            if (d == null)
                return null;
            return bytesToHexString(d, 0, d.length, spaced);
        }
    
    }
  • 相关阅读:
    LeetCode_35.搜索插入位置
    LeetCode_349.两个数组的交集
    LeetCode_344.反转字符串
    LeetCode_34.在排序数组中查找元素的第一个和最后一个位置
    LeetCode_303.区域和检索
    LeetCode_3.无重复字符的最长子串
    LeetCode_292.Nim 游戏
    LeetCode_283.移动零
    LeetCode_27.移除元素
    LeetCode_268.丢失的数字
  • 原文地址:https://www.cnblogs.com/huyanlon/p/10641377.html
Copyright © 2011-2022 走看看