zoukankan      html  css  js  c++  java
  • Java HexString

    byte[]和十六进制字符串相互转换

    Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示。

    所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果

    new String(H) + new String(L)

    同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上。

    根据以上原理,我们就可以将byte[] 数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte[]数组了。

    Java代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    package test;
      
    public class Hex {
      
        /**
         * 用于建立十六进制字符的输出的小写字符数组
         */
        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'};
      
        /**
         * 将字节数组转换为十六进制字符数组
         *
         * @param data byte[]
         * @return 十六进制char[]
         */
        public static char[] encodeHex(byte[] data) {
            return encodeHex(data, true);
        }
      
        /**
         * 将字节数组转换为十六进制字符数组
         *
         * @param data        byte[]
         * @param toLowerCase <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
         * @return 十六进制char[]
         */
        public static char[] encodeHex(byte[] data, boolean toLowerCase) {
            return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
        }
      
        /**
         * 将字节数组转换为十六进制字符数组
         *
         * @param data     byte[]
         * @param toDigits 用于控制输出的char[]
         * @return 十六进制char[]
         */
        protected static char[] encodeHex(byte[] data, char[] toDigits) {
            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++] = toDigits[(0xF0 & data[i]) >>> 4];
                out[j++] = toDigits[0x0F & data[i]];
            }
            return out;
        }
      
        /**
         * 将字节数组转换为十六进制字符串
         *
         * @param data byte[]
         * @return 十六进制String
         */
        public static String encodeHexStr(byte[] data) {
            return encodeHexStr(data, true);
        }
      
        /**
         * 将字节数组转换为十六进制字符串
         *
         * @param data        byte[]
         * @param toLowerCase <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式
         * @return 十六进制String
         */
        public static String encodeHexStr(byte[] data, boolean toLowerCase) {
            return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
        }
      
        /**
         * 将字节数组转换为十六进制字符串
         *
         * @param data     byte[]
         * @param toDigits 用于控制输出的char[]
         * @return 十六进制String
         */
        protected static String encodeHexStr(byte[] data, char[] toDigits) {
            return new String(encodeHex(data, toDigits));
        }
      
        /**
         * 将十六进制字符数组转换为字节数组
         *
         * @param data 十六进制char[]
         * @return byte[]
         * @throws RuntimeException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常
         */
        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;
        }
      
        /**
         * 将十六进制字符转换成一个整数
         *
         * @param ch    十六进制char
         * @param index 十六进制字符在字符数组中的位置
         * @return 一个整数
         * @throws RuntimeException 当ch不是一个合法的十六进制字符时,抛出运行时异常
         */
        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 void main(String[] args) {
            String srcStr = "qwer";
            String encodeStr = encodeHexStr(srcStr.getBytes());
            String decodeStr = new String(decodeHex(encodeStr.toCharArray()));
            System.out.println("before encode:" + srcStr);
            System.out.println("after encode:" + encodeStr);
            System.out.println("convert:" + decodeStr);
        }
      
    }

    还可以使用common codec来编解码hex string,如下代码片段,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @Test
    public void test() {
        String hello = "asdfasdf你还要asdfasdfasdfasdfl";
        try {
            String hexString = Hex.encodeHexString(hello.getBytes("utf-8"));
            String hexString2 = Hex.encodeHexString(hello.getBytes("ascii"));
            String hexString3 = Hex.encodeHexString(hello.getBytes("gbk"));
            String hexString4 = new String(Hex.encodeHex(hello.getBytes("utf-8"), false));
            System.out.println(hexString);
            System.out.println(hexString2);
            System.out.println(hexString3);
            System.out.println(hexString4);
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    ==================END==================

  • 相关阅读:
    conda使用
    onedrive共享文件的下载
    生物信息软件安装(不定时更新)
    if 的常见问题解析
    C语言常见的误区
    流程控制
    C语言中的运算符
    scanf的具体用法
    代码的规范
    printf中的x%及用法
  • 原文地址:https://www.cnblogs.com/exmyth/p/4949327.html
Copyright © 2011-2022 走看看