zoukankan      html  css  js  c++  java
  • java byte数组与16进制间的相互转换

    java byte数组与16进制间的相互转换

    CreationTime--2018年6月11日15点34分

    Author:Marydon

    1.准备工作

    import java.util.Arrays;
    
    /**
     * Byte[]与hex的相互转换
     * @explain
     * @author Marydon
     * @creationTime 2018年6月11日下午2:29:11
     * @version 1.0
     * @since
     * @email marydon20170307@163.com
     */
    public class ByteUtils {
    
        // 16进制字符
        private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    }

    2.byte类型数组转化成16进制字符串

      方法一

    /**
     * 方法一:将byte类型数组转化成16进制字符串
     * @explain 字符串拼接
     * @param bytes
     * @return
     */
    public static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        int num;
        for (byte b : bytes) {
            num = b < 0 ? 256 + b : b;
            sb.append(HEX_CHAR[num / 16]).append(HEX_CHAR[num % 16]);
        }
        return sb.toString();
    }

      方法二

    /**
     * 方法二: byte[] to hex string
     * @explain 使用数组
     * @param bytes
     * @return
     */
    public static String toHexString2(byte[] bytes) {
        // 一个byte为8位,可用两个十六进制位表示
        char[] buf = new char[bytes.length * 2];
        int a = 0;
        int index = 0;
        // 使用除与取余进行转换
        for (byte b : bytes) {
            if (b < 0)
                a = 256 + b;
            else
                a = b;
    
            // 偶数位用商表示
            buf[index++] = HEX_CHAR[a / 16];
            // 奇数位用余数表示
            buf[index++] = HEX_CHAR[a % 16];
        }
        // char[]-->String
        return new String(buf);
    }

      方法三

    /**
     * 方法三: byte[]-->hexString
     * @explain 使用位运算
     * @param bytes
     * @return
     */
    public static String toHexString3(byte[] bytes) {
        char[] buf = new char[bytes.length * 2];
        int index = 0;
        // 利用位运算进行转换,可以看作方法二的变型
        for (byte b : bytes) {
            buf[index++] = HEX_CHAR[b >>> 4 & 0xf];
            buf[index++] = HEX_CHAR[b & 0xf];
        }
    
        return new String(buf);
    }

      方法四

    /**
     * 方法四:byte[]-->hexString
     * @param bytes
     * @return
     */
    public static String toHexString4(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        // 使用String的format方法进行转换
        for (byte b : bytes) {
            sb.append(String.format("%02x", new Integer(b & 0xff)));
        }
    
        return sb.toString();
    }

      方法五

    /**
     * 将byte数组转换成16进制字符串
     * 
     * @param src
     * @return
     */
    private static String bytesToHexString(byte[] src) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                sb.append(0);
            }
            sb.append(hv);
        }
        return sb.toString();
    }  

    3.16进制字符串转换为byte[]

      方法一

    /**
     * 将16进制字符串转换为byte[]
     * @explain 16进制字符串不区分大小写,返回的数组相同
     * @param hexString
     *            16进制字符串
     * @return byte[]
     */
    public static byte[] fromHexString(String hexString) {
        if (null == hexString || "".equals(hexString.trim())) {
            return new byte[0];
        }
    
        byte[] bytes = new byte[hexString.length() / 2];
        // 16进制字符串
        String hex;
        for (int i = 0; i < hexString.length() / 2; i++) {
            // 每次截取2位
            hex = hexString.substring(i * 2, i * 2 + 2);
            // 16进制-->十进制
            bytes[i] = (byte) Integer.parseInt(hex, 16);
        }
    
        return bytes;
    }

      方法二

    /**
     * 将16进制转换为byte[]
     * @param hexStr
     * @return
     */
    public static byte[] fromHex(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }
    

      方法三:

    public static byte[] toByteArray(String data) {
    	if (data == null) {
    		return new byte[] {};
    	}
    	if (data.length() == 0) {
    		return new byte[] {};
    	}
    	while (data.length() < 2) {
    		data = "0" + data;
    	}
    	if (data.substring(0, 2).toLowerCase().equals("0x")) {
    		data = data.substring(2);
    	}
    	if (data.length() % 2 == 1) {
    		data = "0" + data;
    	}
    	data = data.toUpperCase();
    	byte[] bytes = new byte[data.length() / 2];
    	String hexString = "0123456789ABCDEF";
    	for (int i = 0; i < bytes.length; i++) {
    		int byteConv = hexString.indexOf(data.charAt(i * 2)) * 0x10;
    		byteConv += hexString.indexOf(data.charAt(i * 2 + 1));
    		bytes[i] = (byte) (byteConv & 0xFF);
    	}
    	return bytes;
    }  

    4.测试

    public static void main(String[] args) throws Exception {
        String json = "{"name":"Marydon","website":"http://www.cnblogs.com/Marydon20170307"}";
        byte[] bytes = json.getBytes("utf-8");
        System.out.println("字节数组为:" + Arrays.toString(bytes));
        System.out.println("byte数组转16进制之方法一:" + toHexString(bytes));
        System.out.println("byte数组转16进制之方法二:" + ByteUtils.toHexString2(bytes));
        System.out.println("byte数组转16进制之方法三:" + ByteUtils.toHexString3(bytes));
        System.out.println("byte数组转16进制之方法四:" + ByteUtils.toHexString4(bytes));
        System.out.println("==================================");
        String str = "7b226e616d65223a224d617279646f6e222c2277656273697465223a22687474703a2f2f7777772e636e626c6f67732e636f6d2f4d617279646f6e3230313730333037227d";
        System.out.println("转换后的字节数组:" + Arrays.toString(fromHexString(str)));
        System.out.println(new String(fromHexString(str), "utf-8"));
    }

    20200520补充

      1B=8b,也就是1byte=8bit;

      1KB=1024B;

      1MB=1024KB;

      1GB=1024MB;

      1TB=1024GB

      bit是计算机最小的存储单元,只能存储0和1,是Binary digit(二进制数位)的缩写,意为“位”或“比特”,也就是二进制。

  • 相关阅读:
    SAP系统邮件功能配置
    SAP SQL 表inner join 不同长度字段连接
    Read_text 获取传入参数
    imageio.write 惹的祸,占用cpu过高,堆溢出问题
    消息队列报 堆溢出解决方案
    技术文档java
    maven:项目中一些依赖不能更新可使用如下命令进行更新 maven库
    volatile 验证 java
    用Lock 和Newcondition实现同步容器 java
    计算数组中有几对相反数
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/9167339.html
Copyright © 2011-2022 走看看