Recent Posts
Recent Comments
Link
06-29 02:47
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

byte 와 16진수(Hex) String 변환 본문

DEV&OPS/Java

byte 와 16진수(Hex) String 변환

ALEPH.GEM 2022. 5. 26. 17:37

byte는 8 bits 2진법(0 or 1)으로 표현된 데이터 입니다.

16진법은 0~9, A~F 까지 기호를 사용하여 숫자를 표현(코딩)하는 방식입니다.

64진법은 0~9, a~z, A~Z, +, /  기호를 이용하여 숫자를 표현(코딩)하는 방식입니다.

byte array 는 2진수로 이루어진 데이터 입니다만 사람이 읽기 어려우므로

16진법(Hex digits)이나 64진법(base64)으로 변환하여 2진수의 배열(byte array)을 문자처럼 사용하기도 합니다.

 

java에서 byte 데이터를 16진수 String으로 바꿀 때 보통 아래와 같은 소스 코드를 이용합니다.

Integer.toString(((int) bytedata & 0xff)+0x100, 16).substring(1);


Integer.toString(int값, 16) 메서드를 통해서 byte를 16진수 Hex String으로 변환할 때
1byte = 8bit 를  int 형으로 형변환 하면
int는 32bit(=8bit * 4) 라서 메모리 공간이 본래 데이터보다 4배 늘어납니다.
그래서 본래데이터 앞에 늘어날 메모리 공간인 24bit를 0으로 채우기 하기 위해
0xff = 255 으로 bit and 연산을 해야 합니다.
왜냐하면 java는 양수일 때는 늘어난 메모리 공간이 0으로 채워지는데
하지만 음수인 경우 1로 늘어난 메모리 공간 자리수에 채워지기 때문입니다.
그래서 강제로 0으로 채우기 위해서 bit and 연산인  & 0xff 을 수행하는 것입니다.

또한 16진수 10 보다 작은 경우 즉. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 를
00, 01, 02, 03, 04, 05, 06, 07, 08, 09 으로 만들기 위해 앞에 0을 붙여야 하는데
그 때문에 16진수인 0x100 을 더해서
100, 101, 102, 103, 104, 105, 106, 107, 108, 109  로 만든 다음에
substring(1) 로 앞에 붙은 1을 잘라내어
00, 01, 02, 03, 04, 05, 06, 07, 08, 09  으로 표현 할 수 있습니다.

하지만 고맙게도 java.math.BigInteger 에 메서드로 구현해 놓았습니다.

1. hex string -> byte array

byte[] byteArray = new java.math.BigInteger(hexText, 16).toByteArray();

2. byte array -> hex string

String hexText = new java.math.BigInteger(byteArray).toString(16);

 

 

byte array를 String으로 변환하고 또 그 String을 byte array로 복원하는 쓸만한 자바 메서드를 구현해 봤습니다.

 

	//byte 배열을 16진수 String으로 변환
	public static String byteToHexString(byte[] byteArray) {
		StringBuffer sb = new StringBuffer(byteArray.length * 2);
		for(byte b : byteArray) {
			sb.append(String.format("%02x", b).toUpperCase());
		}
		return sb.toString();
	}
	
	//16진수 Digits String을 다시 원래의 byte 배열로 되돌림.
	public static byte[] hexStringToByteArray(String str) {
	    int len = str.length();
	    byte[] data = new byte[len / 2];
	    for (int i = 0; i < len; i += 2) {
	        data[i / 2] = (byte) ((Character.digit(str.charAt(i), 16) << 4) + Character.digit(str.charAt(i+1), 16));
	    }
	    return data;
	}

 

 

 

 

 

 

DEV

 

728x90

'DEV&OPS > Java' 카테고리의 다른 글

자바 웹 어플리케이션  (0) 2022.06.02
OkHttp 를 이용한 REST Client 구현 예제  (0) 2022.05.26
BASE64 (64진법)  (2) 2022.05.26
NIO TCP 비동기 채널방식 채팅 서버/클라이언트  (0) 2022.05.26
NIO TCP Non-Blocking Channel  (0) 2022.05.26