1. ByteArray를 Int로 변환
ByteArray를 Int로 변환하는 방법은 비트연산자를 이용하는 방법과 ByteBuffer를 사용하는 방법이 있습니다.
다음은 비트연산자를 사용해서 ByteArray를 Int로 변환하는 예제 코드입니다. 이 예제에서는 Big-Endian 방식을 사용합니다. 만약 Little-Endian 방식으로 변환하려면, 바이트 순서를 뒤집어야 합니다.
1-1. 비트연산자
Big-Endian 변환 예제
fun ByteArray.toIntBigEndian(): Int {
if (this.size < 4) throw IllegalArgumentException("ByteArray size is less than 4")
return (this[0].toInt() and 0xFF shl 24) or
(this[1].toInt() and 0xFF shl 16) or
(this[2].toInt() and 0xFF shl 8) or
(this[3].toInt() and 0xFF)
}
fun main() {
val byteArray = byteArrayOf(0x00, 0x00, 0x1A, 0x2B)
val intValue = byteArray.toIntBigEndian()
println("Converted int value: $intValue")
}
- 바이트 배열 크기 검사: this.size < 4로 배열의 크기가 4보다 작은지 확인합니다. Int 타입은 4바이트(32비트)를 차지하기 때문에, 배열의 크기가 4보다 작으면 Int로 변환할 충분한 정보가 없습니다. 이 경우 IllegalArgumentException을 던집니다.
- 바이트 별로 변환 및 결합:
- this[0].toInt() and 0xFF shl 24: 배열의 첫 번째 바이트(this[0])를 Int로 변환하고, and 0xFF를 사용하여 부호 없는 정수로 취급합니다. 그런 다음 shl 24(왼쪽으로 24비트 시프트)를 사용하여 가장 높은 바이트 위치로 이동합니다.
- this[1].toInt() and 0xFF shl 16: 배열의 두 번째 바이트를 동일한 방법으로 처리하고, 16비트 왼쪽으로 시프트하여 두 번째로 높은 바이트 위치로 이동합니다.
- this[2].toInt() and 0xFF shl 8: 세 번째 바이트를 처리하고, 8비트 왼쪽으로 시프트하여 세 번째로 높은 바이트 위치로 이동합니다.
- this[3].toInt() and 0xFF: 배열의 네 번째 바이트를 처리합니다. 이 경우 추가적인 비트 시프트는 필요 없습니다.
- 비트 OR 연산을 통한 결합: or 연산자를 사용하여 위에서 처리한 네 개의 값을 결합합니다. 이렇게 하면 네 개의 바이트가 하나의 Int 값으로 합쳐집니다.
Little-Endian 변환 예제
fun ByteArray.toIntLittleEndian(): Int {
if (this.size < 4) throw IllegalArgumentException("ByteArray size is less than 4")
return (this[3].toInt() and 0xFF shl 24) or
(this[2].toInt() and 0xFF shl 16) or
(this[1].toInt() and 0xFF shl 8) or
(this[0].toInt() and 0xFF)
}
fun main() {
val byteArray = byteArrayOf(0x2B, 0x1A, 0x00, 0x00) // Little-Endian 예시
val intValue = byteArray.toIntLittleEndian()
println("Converted int value: $intValue")
}
1-2. ByteBuffer
fun byteArrayToInt(byteArray: ByteArray): Int {
return ByteBuffer.wrap(byteArray).getInt()
}
ByteBuffer.wrap() 메서드를 사용하여 ByteArray를 감싸는 ByteBuffer 인스턴스를 생성합니다. 이 과정에서 ByteArray의 내용이 ByteBuffer의 내부 배열로 복사됩니다.
getInt() 메서드를 호출하여 현재 ByteBuffer의 위치에서 4바이트를 읽어 Int 값으로 변환합니다. 이때, ByteBuffer의 바이트 순서(Byte Order)가 시스템의 기본 바이트 순서와 일치하는지 확인해야 할 수도 있습니다. 기본적으로는 Big Endian을 사용하지만, 필요에 따라 order(ByteOrder.LITTLE_ENDIAN) 메서드를 호출하여 Little Endian으로 설정할 수 있습니다.
2. Int를 ByteArray로 변환
ByteBuffer 클래스를 사용하여 Int 값을 바이트 배열로 변환할 수 있습니다. ByteBuffer는 바이트 버퍼를 다루기 위한 유틸리티 클래스로, 다양한 기본 타입을 바이트 배열로 변환할 수 있는 기능을 제공합니다.
fun intToByteArray(value: Int): ByteArray {
return ByteBuffer.allocate(4).putInt(value).array()
}
fun main() {
val myInt = 123456
val byteArray = intToByteArray(myInt)
println(byteArray.joinToString(", ") { it.toString() })
}
위 예제에서 ByteBuffer.allocate(4)는 4바이트 크기의 버퍼를 할당합니다. putInt(value) 메서드를 사용하여 Int 값을 버퍼에 넣고, array() 메서드를 사용하여 바이트 배열을 얻습니다.
참고자료
'개발 > kotlin' 카테고리의 다른 글
Spring Boot JPA와 Kotlin Reflect 오류 해결 방법 (0) | 2024.08.08 |
---|---|
JSON을 Kotlin DTO로 변환하는 방법 - Kotlinx.Serialization 활용 가이드 (0) | 2024.08.02 |
object, companion object, 최상위 함수 정리 (0) | 2024.07.06 |
[라이브러리] [Proj4J] 좌표계 변환 방법 (0) | 2024.07.04 |