欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【util】用java实现16进制和byte,string的相互转换以及格式化16进制

程序员文章站 2022-03-13 15:35:54
...

最近程序用到的16进制比较多,所以写了一个16进制的util,供大家参考
工具类

package utils;

import java.io.UnsupportedEncodingException;

/**
 * 
 * @author qq1623299667
 *
 */
public class HexUtil {

	/**
	 * 将任何字符串按指定编码输出成特定格式的16进制
	 * @param string
	 * @param charsetName
	 * @return
	 */
	public static String stringToHexString(String string,String charsetName) {
		StringBuilder sb = new StringBuilder();
		try {
				for (int i = 0; i < string.length(); i++) {
					char ch = string.charAt(i);
					byte[] bytes = String.valueOf(ch).getBytes(charsetName);
						String hex = bytesToHexString(bytes);
						sb.append(hex);
				}
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			return sb.toString();
	}
	
	
	/**
	 * 将字节码数组按16进制的方式保存为字符串
	 * @param bytes
	 * @return
	 */
	public static String bytesToHexString(byte[] bytes){  
	    StringBuilder sb = new StringBuilder();  
	    for (int i = 0; i < bytes.length; i++) {  
	        int num = bytes[i] & 0xFF;  
	        String hex = Integer.toHexString(num);
	        if (hex.length() < 2) {  
	            sb.append(0);  
	        }  
	        sb.append(hex); 
	    }  
		return sb.toString();
	}
	
	/**
	 * 将16进制的字符串转换成byte
	 * @param hexString
	 * @return
	 */
	public static byte[] hexStringTobytes(String hexString){
			StringBuilder sb = new StringBuilder();
			for(int i=0;i<hexString.length()/2;i++){
				sb.append(hexString.substring(2*i,2*i+2));
			}
			hexString = sb.toString();
		byte[] bytes = new byte[hexString.length()/2];
		for(int i=0;i<hexString.length()/2;i++){
			bytes[i] = (byte)(0xff & Integer.parseInt(hexString.substring(2*i, 2*i+2), 16));
		}
		return bytes;
	}
	
	/**
	 * 将16进制的字符串转换成string
	 * @param hexString
	 * @return
	 */
	public static String hexStringToString(String hexString,String charsetName){
		try {
			return new String(hexStringTobytes(hexString),charsetName);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 将16进制字符串按特定格式格式化
	 * @param hexString
	 * @return
	 */
	public static String hexStringFormat(String hexString){
		StringBuilder sb = new StringBuilder();
		sb.append("\r\n");
		for(int i=0;i<hexString.length()/2;i++){
			sb.append(hexString.substring(2*i, 2*i+2).toUpperCase());
			sb.append(" ");
			if(i%16==15){
				sb.append("\r\n");
			}
		}
		return sb.toString();
	}
}

测试类

package utils;

/**
 * 
 * @author qq1623299667
 *
 */
public class TestRadix {
	public static void main(String[] args) {
		try{
			//将bytes的16进制输出
			String hexString1 = HexUtil.bytesToHexString("你有没有freestyle?".getBytes("utf-8"));
			System.out.println(hexString1);
			
			//将String的16进制输出
			String hexString2 = HexUtil.stringToHexString("我有freestyle", "utf-8");
			System.out.println(hexString2);
			
			//将16进制的字符串转换成byte
			byte[] bytes = HexUtil.hexStringTobytes(HexUtil.stringToHexString("请务必相信我真的有freestyle!", "utf-8"));
			System.out.println(new String(bytes,"utf-8"));
			
			//将16进制的字符串转换成string
			String string = HexUtil.hexStringToString(HexUtil.stringToHexString("不!你骗人,你根本就没有freestyle!", "utf-8"),"utf-8");
			System.out.println(string);
			
			//将16进制格式化成特定格式
			String hexStringFormat = HexUtil.hexStringFormat(HexUtil.stringToHexString("阁下果然有freestyle,是在下输了!", "utf-8"));
			System.out.println(hexStringFormat);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

输出结果

e4bda0e69c89e6b2a1e69c89667265657374796c65efbc9f
e68891e69c89667265657374796c65
请务必相信我真的有freestyle!
不!你骗人,你根本就没有freestyle!


E9 98 81 E4 B8 8B E6 9E 9C E7 84 B6 E6 9C 89 66 
72 65 65 73 74 79 6C 65 2C E6 98 AF E5 9C A8 E4 
B8 8B E8 BE 93 E4 BA 86 EF BC 81 















相关标签: Java 16进制