ByteArray를 HexString으로, HexString를 ByteArray로 변환하는 방법에 대해서
Java / Kotlin으로 작성하고 간략하게 테스트해 보았습니다.
1. ByteArray to HexString 변환
ByteArray를 HexString으로 변환하는 방법으로 아래와 같이 작성하였습니다.
문자열로 변환하는 부분에서 %02X의 경우 대문자(ex 1A5F), %02x의 경우 소문자(ex 1a5f)로
원하시는 출력 방법을 선택 해주시면 될 것 같습니다.
[Kotlin]
fun toHexString(bytes: ByteArray): String {
val stringBuilder = StringBuilder(bytes.size * 2)
for (byte in bytes) stringBuilder.append(String.format("%02X", byte))
return stringBuilder.toString()
}
[Java]
public String toHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (byte b : bytes) sb.append(String.format("%02X", b));
return sb.toString();
}
2. HexString to ByteArray 변환
HexString를 ByteArray으로 변환하는 방법으로 아래와 같이 작성하였습니다.
한 가지 고민해야 하는 부분이 있는데요,
인자로 들어오는 문자열이 hexString이라는 보장이 없기 때문에
변환하기 전에 hexString 유효성을 확인하는 것이 고려되어야 합니다.
저 같은 경우는 2 Step 단위로 돌아가는 loop 특성상 문자열을 짝수로 맞춰 주는 정도만 추가하였고
try catch를 통해 문제가 생긴다면 유효하지 않은 hexString이라고 판단하고 null 을 반환하도록 하였습니다.
[Kotlin]
fun hexStringToBytes(hex: String): ByteArray? {
// Check valid : Hex String
val hexString =
if (hex.length % 2 == 0) hex
else "0$hex"
val length = hexString.length
return try {
val data = ByteArray(length / 2)
var i = 0
while (i < length) {
val s = hexString.substring(i, i + 2)
data[i / 2] = BigInteger(s, 16).toByte()
i += 2
}
data
} catch (e: Exception) {
e.printStackTrace()
null
}
}
[Java]
public byte[] hexStringToBytes(String hex) {
// Check valid : Hex String
if (hex.length() % 2 != 0) {
hex = "0" + hex;
}
int length = hex.length();
try {
int size = (length / 2);
byte[] data = new byte[size];
for (int i = 0; i < length; i += 2) {
String s = hex.substring(i, i + 2);
data[i / 2] = new BigInteger(s, 16).byteValue();
}
return data;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
3. 테스트
아래와 같이 테스트 결과를 확인 할 수 있었습니다.
val bytes = byteArrayOf(1, 5, 10, 100)
Log.d("TEST", "bytes ${bytes.contentToString()}")
// Use Kotlin Function
val hexString = UtilKotlin.toHexString(bytes)
val result = UtilKotlin.hexStringToBytes(hexString)
Log.d("TEST", "hexString $hexString")
Log.d("TEST", "result ${result.contentToString()}")
TEST/D bytes [1, 5, 10, 100]
TEST/D [ByteArray to HexString] hexString 01050A64
TEST/D [HexString to ByteArray] result [1, 5, 10, 100]
val bytes = byteArrayOf(1, 5, 10, 100)
Log.d("TEST", "bytes ${bytes.contentToString()}")
// Use Java Function
val hexString = UtilJava.toHexString(bytes)
val result = UtilJava.hexStringToBytes(hexString)
Log.d("TEST", "[ByteArray to HexString] hexString $hexString")
Log.d("TEST", "[HexString to ByteArray] result ${result.contentToString()}")
TEST/D bytes [1, 5, 10, 100]
TEST/D [ByteArray to HexString] hexString 01050A64
TEST/D [HexString to ByteArray] result [1, 5, 10, 100]
0 comments: