• Java实现byte数组与Hex互转


    十六进制字符的输出大写字符:0123456789ABCDEF
    十六进制字符的输出小写字符:0123456789abcdef
    
    • 1
    • 2

    下面使用十六进制大写字符。

    1、方式1

    public class HexStringUtils {
        private static final char[] HEX_CHAR_TABLE = {
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
        };
        private static final Map<Character, Byte> HEX_BYTE_MAP = new HashMap<>();
    
        static {
            for (int i = 0; i < HEX_CHAR_TABLE.length; i++) {
                char c = HEX_CHAR_TABLE[i];
                HEX_BYTE_MAP.put(c, (byte) i);
            }
        }
    
        /**
         * 将byte数组转换为表示16进制值的字符串
         *
         * @param byteArray 需要转换的byte数组
         * @return 转换后的字符串(16进制值)
         */
        public static String byteArrayToHexString(byte[] byteArray) {
            if (byteArray == null) {
                return null;
            }
            StringBuilder sb = new StringBuilder();
            for (byte b : byteArray) {
                sb.append(HEX_CHAR_TABLE[(b & 0xf0) >> 4]);
                sb.append(HEX_CHAR_TABLE[b & 0x0f]);
            }
            return sb.toString();
        }
    
        /**
         * 将表示16进制值的字符串转换为byte数组
         *
         * @param hexString 需要转换的字符串(16进制值)
         * @return 转换后的byte数组
         */
        public static byte[] hexStringToByteArray(String hexString) {
            if (StringUtils.isBlank(hexString)) {
                return null;
            }
            // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
            byte[] byteArray = new byte[hexString.length() / 2];
            for (int i = 0; i < hexString.length() / 2; i++) {
                char hi = hexString.charAt(i * 2);
                char lo = hexString.charAt(i * 2 + 1);
                byteArray[i] = (byte) ((HEX_BYTE_MAP.get(hi) << 4) + HEX_BYTE_MAP.get(lo));
            }
            return byteArray;
        }
    
        public static void main(String[] args) {
            String str = "你好 asa;==ff--00=-=";
            //
            String hexString = byteArrayToHexString(str.getBytes());
            System.out.println(str.length());
            System.out.println(hexString);
            System.out.println(hexString.length());
    
            System.out.println("===========");
            byte[] bytes = hexStringToByteArray(hexString);
            System.out.println(Arrays.toString(bytes));
            System.out.println(new String(bytes));
        }
    }
    
    • 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

    在这里插入图片描述

    2、方式2

    public class HexStringUtils {
    
        public static byte[] hexStringToByteArray(String hexString) {
            if (StringUtils.isEmpty(hexString)) {
                return null;
            }
            hexString = hexString.toLowerCase();
            final byte[] byteArray = new byte[hexString.length() >> 1];
            int index = 0;
            for (int i = 0; i < hexString.length(); i++) {
                if (index > hexString.length() - 1) {
                    return byteArray;
                }
                byte highDit = (byte) (Character.digit(hexString.charAt(index), 16) & 0xFF);
                byte lowDit = (byte) (Character.digit(hexString.charAt(index + 1), 16) & 0xFF);
                byteArray[i] = (byte) (highDit << 4 | lowDit);
                index += 2;
            }
            return byteArray;
        }
    
    
        public static String byteArrayToHexString(byte[] byteArray) {
            if (byteArray == null) {
                return null;
            }
            // HEX_CHAR_TABLE  0123456789abcdef
            char[] hexArray = "0123456789ABCDEF".toCharArray();
            char[] hexChars = new char[byteArray.length * 2];
            for (int j = 0; j < byteArray.length; j++) {
                int v = byteArray[j] & 0xFF;
                hexChars[j * 2] = hexArray[v >>> 4];
                hexChars[j * 2 + 1] = hexArray[v & 0x0F];
            }
            return new String(hexChars);
        }
    
        public static void main(String[] args) {
            String str = "你好 asa;==ff--00=-=";
            //
            String hexString = byteArrayToHexString(str.getBytes());
            System.out.println(str.length());
            System.out.println(hexString);
            System.out.println(hexString.length());
    
            System.out.println("===========");
            byte[] bytes = hexStringToByteArray(hexString);
            System.out.println(Arrays.toString(bytes));
            System.out.println(new String(bytes));
        }
    
    }
    
    • 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

    求知若饥,虚心若愚。

  • 相关阅读:
    MySQL数据库脱敏方案
    无语,程序在main方法执行和在junit单元测试结果居然不一致
    MySQL4
    java-数据迁移-定制拓展
    uniapp 之使用 u-upload 组件来实现图片上传
    手写一个PrattParser基本运算解析器4: 简述iOS的编译过程
    2021最新中高级Java面试题目,Java面试题汇总
    Mysql索引(究极无敌细节版)
    边缘计算:云计算的延伸
    bit、bin 、mcs文件区别
  • 原文地址:https://blog.csdn.net/qq_42402854/article/details/133275724