Hex Bytes

 

好些年前写的,偶然找出来,临时用下,顺便分享下~~  性能好像不咋地 

 

import java.io.ByteArrayOutputStream;

public class UltraEdit {
	public static void main(String[] args) {
		System.out.println(UltraEdit.getInstance().getHexUpperCase(" 测试 & 数据 Test Data".getBytes()));
		System.out.println(UltraEdit.getInstance().b2HEX(" 测试 & 数据 Test Data".getBytes(),":"));
		String hex = UltraEdit.getInstance().b2HEX(" 测试 & 数据 Test Data".getBytes());
		System.out.println(hex);
		System.out.println(new String(UltraEdit.getInstance().hex2b(hex)));
		
		UltraEdit.getInstance().hex2b("F");
	}
	
	
	private final static UltraEdit instance = new UltraEdit(); 
	
	private UltraEdit() {
		Configuration.byte2HexUpper = new Byte2HexUpper();
		Configuration.byte2HexLower = new Byte2HexLower();
		Configuration.byte2ASCII = new Byte2ASCII();
	}
	
	public synchronized static UltraEdit getInstance() {
		return instance;
	}
	
	public String getHexUpperCase(byte[] data) {
		return byte2HexFormat(data, 16, Configuration.byte2HexUpper,Configuration.byte2ASCII);
	}	
	
	public String getHexLowerCase(byte[] data) {
		return byte2HexFormat(data, 16, Configuration.byte2HexLower,Configuration.byte2ASCII);
	}
	
	public String getHexUpperCase(byte[] data,int width) {
		return byte2HexFormat(data, width, Configuration.byte2HexUpper,Configuration.byte2ASCII);
	}
	
	public String getHexLowerCase(byte[] data,int width) {
		return byte2HexFormat(data, width, Configuration.byte2HexLower,Configuration.byte2ASCII);
	}
	
	/** 将byte[]数据以十六进制的形式显示,显示格式仿照UltraEdit*/
	private String byte2HexFormat(byte[] data,int width,
			IByte2String hexPartitionMethod,IByte2String strPartitionMethod) 
	{
		StringBuffer sb = new StringBuffer();
		//表头
		for(int i=0;i<width;i++) {
			sb.append("-");
			if(i<10) sb.append(i);
			else sb.append((char)(i-10+'a'));
			sb.append("-");
		}
		sb.append("\r\n");
		int index = 0;
		StringBuffer hexPartionLine = new StringBuffer();
		StringBuffer strPartionLine = new StringBuffer();
		while(index < data.length) {
			int lineStart = index; 
			while(index < data.length && index < lineStart+width) {
				hexPartionLine.append(hexPartitionMethod.byte2String(data[index]))
									.append(Configuration.DELIMITER);
				strPartionLine.append(strPartitionMethod.byte2String(data[index]));
				index ++;
			}
			int placeholderNum = 0;
			while(index+placeholderNum < lineStart+width) {//对最后一行不足width的在HexPartition部分补充占位符
				hexPartionLine.append("   ");
				placeholderNum += 1;
			}
			sb.append(hexPartionLine).append(Configuration.PARTITION)
								.append(strPartionLine).append("\r\n");//完成一行显示
			hexPartionLine.delete(0, hexPartionLine.length());
			strPartionLine.delete(0, strPartionLine.length());
		}
		return sb.toString();
	}
	
	public String b2HEX(byte[] data) {
		return byte2Hex(data, "", Configuration.byte2HexUpper);
	}
	
	public String b2HEX(byte[] data,String delimiter) {
		return byte2Hex(data, delimiter, Configuration.byte2HexUpper);
	}
	
	public String b2hex(byte[] data) {
		return byte2Hex(data, "", Configuration.byte2HexLower);
	}
	
	public String b2hex(byte[] data,String delimiter) {
		return byte2Hex(data, "", Configuration.byte2HexLower);
	}
	
	private String byte2Hex(byte[] data,String delimiter,IByte2String form) {
		StringBuffer sb = new StringBuffer();
		int index = 0;
		while(index < data.length) {
			sb.append(form.byte2String(data[index])).append(delimiter);
			index ++;
		}
		return sb.toString();
	}

	public byte[] hex2b(String hexStr) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		if(hexStr.length() % 2 != 0) {
			throw new IllegalArgumentException("输入参数"+hexStr+"长度不是偶数.");
		}
		int c = 0;
		while(c < hexStr.length()) {
			int high = Configuration.hexChar2Int(hexStr.charAt(c));
			int low = Configuration.hexChar2Int(hexStr.charAt(c+1));
			if(high == -1) {
				throw new IllegalArgumentException("输入参数"+hexStr+".charAt("+c+")="+hexStr.charAt(c)+"不是合法的HexChar");
			}
			if(low == -1) {
				throw new IllegalArgumentException("输入参数"+hexStr+".charAt("+(c+1)+")="+hexStr.charAt(c+1)+"不是合法的HexChar");
			}
			baos.write(Configuration.BCDPackedFormat(high,low));
			c += 2;
		}
		return baos.toByteArray();
	}
		
	private static class Configuration {
		static final char[] HEX_UPPER_CASE = new char[]{
			'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
		};
	
		static final char[] HEX_LOWER_CASE = new char[]{
			'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'
		};
		
		/**
		 * @return -1 表示输入参数hexChar不是个合法的HexChar. 其他情况返回的数据控制在[0,15]
		 * */
		static int hexChar2Int(char hexChar) {
			if(Character.isDigit(hexChar)) return hexChar - '0';
			else if(Character.isLowerCase(hexChar)) return hexChar - 'a' + 10;
			else if(Character.isUpperCase(hexChar)) return hexChar - 'A' + 10;
			else return -1;
		}
		
		static byte BCDPackedFormat(int high,int lower) {
			int min = Math.min(high, lower);
			int max = Math.max(high, lower);
			if(min<0 || max >15) {
				throw new IllegalArgumentException("输入参数"+high+","+lower+"都必须控制在范围[0,15]内");
			}
			return (byte)(high << 4 | lower);
		}
		
		/** 各个Byte之间的分割符号*/
		static final String DELIMITER = " ";
		
		/** Hex显示和字符显示区域分割符*/
		static final String PARTITION = ";";
		
		static IByte2String byte2HexUpper;
		
		static IByte2String byte2HexLower;
		
		static IByte2String byte2ASCII;
		
		
	} 
	
	interface IByte2String {
		public String byte2String(byte b); 
	}
	
	class Byte2HexUpper implements IByte2String {
		public String byte2String(byte b) {
			int high = 0x0F & b>>4;
			int low  = 0x0F & b;
			return new String(new char[] {Configuration.HEX_UPPER_CASE[high],
								Configuration.HEX_UPPER_CASE[low]});
		}
	}
	
	class Byte2HexLower implements IByte2String {
		public String byte2String(byte b) {
			int high = 0x0F & b>>4;
			int low  = 0x0F & b;
			return new String(new char[] {Configuration.HEX_LOWER_CASE[high],
							Configuration.HEX_LOWER_CASE[low]});
		}
	}
	
	class Byte2ASCII implements IByte2String {
		private final String INVISIBLE_SUBSTITUTION = ".";
		
		public String byte2String(byte b) {
			return (Character.isWhitespace(b) || Character.isLetterOrDigit(b)) ? new String(new byte[]{b}) : INVISIBLE_SUBSTITUTION;
		}
	}
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值