Java에서 16진수 문자열을 바이트 배열로 변환하려면 먼저 Integer 클래스의 parseInt() 메서드를 사용하여 16진수를 10진수 정수 값으로 변환합니다. 이어서 BigInteger 클래스의 toByteArray() 메서드를 호출하면 최종적으로 바이트 배열을 얻을 수 있습니다.
변환 과정
전체 변환 절차는 다음 세 단계로 정리할 수 있습니다.
- parseInt() 메서드에 변환할 문자열과 진수(16)를 인자로 전달하여 16진수 문자열을 10진수 정수로 변환합니다.
- BigInteger.valueOf() 메서드를 사용해 해당 정수 값을 BigInteger 객체로 만듭니다.
- toByteArray() 메서드를 호출하여 바이트 배열을 반환받습니다.
예제 코드
import java.math.BigInteger;
public class Demo {
public static void main(String args[]) {
String str = "1D08A";
int it = Integer.parseInt(str, 16);
System.out.println("Hexadecimal String " + str);
BigInteger bigInt = BigInteger.valueOf(it);
byte[] bytearray = bigInt.toByteArray();
System.out.print("Byte Array : ");
for (int i = 0; i < bytearray.length; i++)
System.out.print(bytearray[i] + "\t");
}
}실행 결과
Hexadecimal String 1D08A Byte Array : 1 -48 -118
결과 해석
16진수 "1D08A"는 10진수로 118922이며, 이 값은 0x01, 0xD0, 0x8A의 세 바이트로 표현됩니다. Java의 byte 타입은 부호 있는(signed) 값이므로 0xD0은 -48, 0x8A는 -118로 출력됩니다. 또한 첫 번째 바이트가 1로 나타나는 이유는 toByteArray()가 부호 비트를 유지하기 위해 항상 최상위 바이트를 포함하기 때문입니다.
주의 사항: 큰 값 처리하기
Integer.parseInt()는 int 타입 범위(약 ±21억) 안의 값만 처리할 수 있습니다. 따라서 이보다 긴 16진수 문자열을 변환할 때는 아래와 같이 BigInteger 생성자를 직접 사용하는 방식이 안전하고 권장됩니다.
BigInteger bigInt = new BigInteger("1D08A", 16);
byte[] bytearray = bigInt.toByteArray();이 방법은 int 범위를 초과하는 임의 길이의 16진수 문자열도 오버플로우 없이 처리할 수 있다는 장점이 있습니다.