본문 바로가기

시즌1/Java Tips

[Java Tips] Java Primitive Type을 Hex String으로 변환하는 Utility

정수형 데이터를 Hex String으로 변환 하거나, 그 역변환 하는 방법은 여러가지가 있습니다. Integer.toString(int i, int radix)와 같이 기본 Java API에서 제공되는 부분도 있습니다. 이를 사용해도 되지만, char나 byte 같은 경우는 Type Casting을 통해서 해야 하는 번거로움이 있습니다.

그래서, 다음과 같은 Utility Class를 만들어서 쓰고 있습니다.
package utils;
/**
 * 정수형 타입을 Hex String으로 변환하고, Hex String을 정수형 타입을 변환하는 Utility
 */
public class HexUtils {

	private static final char hexchar[] = { '0', '1', '2', '3', '4', '5',
			'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
	
	/**
	 * byte 데이터를 Hex String을 변환
	 * 
	 * @param b Hex String으로 변환할 byte 데이터
	 * @return Hex String
	 */
	public static String toHexString(byte b) {
		StringBuffer buffer = new StringBuffer();

		buffer.append(hexchar[( b >>> 4) & 0xf]);
		buffer.append(hexchar[b & 0xf]);
		
		return buffer.toString();
	}
	
	/**
	 * char 데이터를 Hex String을 변환
	 * 
	 * @param c Hex String으로 변환할 char 데이터
	 * @return HexString
	 */
	public static String toHexString(char c) {
		StringBuffer buffer = new StringBuffer();

		buffer.append(hexchar[( c >>> 12) & 0xf]);
		buffer.append(hexchar[( c >>> 8) & 0xf]);
		buffer.append(hexchar[( c >>> 4) & 0xf]);
		buffer.append(hexchar[c & 0xf]);
		
		return buffer.toString();
	}
	
	/**
	 * short 데이터를 Hex String을 변환
	 * 
	 * @param s Hex String으로 변환할 short 데이터
	 * @return HexString
	 */
	public static String toHexString(short s) {
		StringBuffer buffer = new StringBuffer();

		buffer.append(hexchar[( s >>> 12) & 0xf]);
		buffer.append(hexchar[( s >>> 8) & 0xf]);
		buffer.append(hexchar[( s >>> 4) & 0xf]);
		buffer.append(hexchar[s & 0xf]);
		
		return buffer.toString();
	}
	
	/**
	 * int 데이터를 Hex String을 변환
	 * 
	 * @param i Hex String으로 변환할 int 데이터
	 * @return HexString
	 */
	public static String toHexString(int i) {
		StringBuffer buffer = new StringBuffer();

		buffer.append(hexchar[( i >>> 28) & 0xf]);
		buffer.append(hexchar[( i >>> 24) & 0xf]);
		buffer.append(hexchar[( i >>> 20) & 0xf]);
		buffer.append(hexchar[( i >>> 16) & 0xf]);
		buffer.append(hexchar[( i >>> 12) & 0xf]);
		buffer.append(hexchar[( i >>> 8) & 0xf]);
		buffer.append(hexchar[( i >>> 4) & 0xf]);
		buffer.append(hexchar[i & 0xf]);
		
		return buffer.toString();
	}
	
	/**
	 * long 데이터를 Hex String을 변환
	 * 
	 * @param l Hex String으로 변환할 long 데이터
	 * @return HexString
	 */
	public static String toHexString(long l){
		StringBuffer buffer = new StringBuffer();

		buffer.append(hexchar[(int)(( l >>> 60) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 56) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 52) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 48) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 44) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 40) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 36) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 32) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 28) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 24) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 20) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 16) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 12) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 8) & 0xf)]);
		buffer.append(hexchar[(int)(( l >>> 4) & 0xf)]);
		buffer.append(hexchar[(int)(l & 0xf)]);
		
		return buffer.toString();
	}
	
	/**
	 * Hex String을 byte로 변환
	 * 
	 * @param hexStr
	 * @return byte
	 */
	public static byte toByte(String hexStr){
		byte result = 0;
		String hex = hexStr.toUpperCase();
		
		for(int i = 0 ; i < hex.length() ; i++){
			char c = hex.charAt(hex.length() - i - 1);
			byte b = toByte(c);
			result |= (b & 0x0f) << (i*4); 
		}
		
		return result;
	}
	
	/**
	 * Hex String을 char 값으로 변환
	 * 
	 * @param hexStr
	 * @return char
	 */
	public static char toChar(String hexStr){
		char result = 0;
		String hex = hexStr.toUpperCase();
		
		for(int i = 0 ; i < hex.length() ; i++){
			char c = hex.charAt(hex.length() - i - 1);
			byte b = toByte(c);
			result |= (b & 0x0f) << (i*4); 
		}
		
		return result;
	}
	
	/**
	 * Hex String을 short으로 변환
	 * 
	 * @param hexStr
	 * @return short 값
	 */
	public static short toShort(String hexStr){
		short result = 0;
		String hex = hexStr.toUpperCase();
		
		for(int i = 0 ; i < hex.length() ; i++){
			char c = hex.charAt(hex.length() - i - 1);
			byte b = toByte(c);
			result |= (b & 0x0f) << (i*4); 
		}
		
		return result;
	}
	
	/**
	 * Hex String을 int로 변환
	 * 
	 * @param hexStr
	 * @return int 값
	 */
	public static int toInt(String hexStr){
		int result = 0;
		String hex = hexStr.toUpperCase();

		for(int i = 0 ; i < hex.length() ; i++){
			char c = hex.charAt(hex.length() - i - 1);
			byte b = toByte(c);
			result |= (b & 0x0f) << (i*4); 
		}
		
		return result;
	}
	
	/**
	 * Hex String을 long으로 변환
	 * 
	 * @param hexStr
	 * @return long 값
	 */
	public static long toLong(String hexStr){
		long result = 0;
		String hex = hexStr.toUpperCase();

		for(int i = 0 ; i < hex.length() ; i++){
			char c = hex.charAt(hex.length() - i - 1);
			byte b = toByte(c);
			result |= (long)(b & 0x0f) << (i*4); 
		}
		
		return result;
	}
	
	private static byte toByte(char c){
		switch(c){
		case '0':
			return 0;
		case '1':
			return 1;
		case '2':
			return 2;
		case '3':
			return 3;
		case '4':
			return 4;
		case '5':
			return 5;
		case '6':
			return 6;
		case '7':
			return 7;
		case '8':
			return 8;
		case '9':
			return 9;
		case 'A':
			return 10;
		case 'B':
			return 11;
		case 'C':
			return 12;
		case 'D':
			return 13;
		case 'E':
			return 14;
		case 'F':
			return 15;
		}
		
		return 0;
	}
}