クマは森で用を足しますか?

アウトプットは重要です。

16 進文字列とバイト値を変換する関数を Kotlin で書く

どうしても至る所で使うことになりそうな気がするので、16 進文字列とバイト値またはその配列を変換する処理をユーティリティとして切り出して整理しておきます。まだまだ不慣れですが、ちょっぴり Kotlin っぽく書けているでしょうか。

値から 16 進文字列への変換(1 バイト分)

fun byteToHexString(byte: Int) = "%02X".format(byte.toByte())

使い方はこう。

@Test
fun return_byteToHexString() {
    assertThat(byteToHexString(0x00)).isEqualTo("00")
    assertThat(byteToHexString(0x01)).isEqualTo("01")
    assertThat(byteToHexString(0x7F)).isEqualTo("7F")
    assertThat(byteToHexString(0x80)).isEqualTo("80")
    assertThat(byteToHexString(0xFF)).isEqualTo("FF")
    assertThat(byteToHexString(0x100)).isEqualTo("00")
}

16 進文字列から値への変換(1 バイト分)

fun hexStringToByte(hexString: String) = hexString.toInt(16).toByte()

使い方はこう。

@Test
fun return_hexStringToByte() {
    assertThat(hexStringToByte("00")).isEqualTo(0x00)
    assertThat(hexStringToByte("01")).isEqualTo(0x01)
    assertThat(hexStringToByte("7F")).isEqualTo(0x7F)
    assertThat(hexStringToByte("80")).isEqualTo(0x80.toByte())
    assertThat(hexStringToByte("FF")).isEqualTo(0xFF.toByte())
}

16 進文字列からバイト配列への変換

fun hexStringToByteArray(hexString: String): ByteArray {
    val array = ByteArray(hexString.length / 2)
    for (index in 0 until array.count()) {
        val pointer = index * 2
        array[index] = hexStringToByte(hexString.substring(pointer,
                pointer + 2))
    }
    return array
}

使い方はこう。

@Test
fun return_hexStringToByteArray_byteArrayToHexString() {
    val hexString = "00" + "01" + "7F" + "80" + "FF"
    val byteArray = byteArrayOf(b(0x00), b(0x01), b(0x7F), b(0x80), b(0xFF))
    assertThat(hexStringToByteArray(hexString)).isEqualTo(byteArray)
}

private fun b(byte: Int) = byte.toByte()

バイト配列から 16 進文字列への変換

fun byteArrayToHexString(bytes: ByteArray): String {
    val builder = StringBuilder()
    for (byte in bytes) {
        builder.append(byteToHexString(byte.toInt()))
    }
    return builder.toString()
}

使い方はこう。

@Test
fun return_hexStringToByteArray_byteArrayToHexString() {
    val byteArray = byteArrayOf(b(0x00), b(0x01), b(0x7F), b(0x80), b(0xFF))
    val hexString = "00" + "01" + "7F" + "80" + "FF"
    assertThat(byteArrayToHexString(byteArray)).isEqualTo(hexString)
}

private fun b(byte: Int) = byte.toByte()

関連のある投稿

ちなみに、同じことを C 言語でやってみたものがこちら。
cheerio-the-bear.hatenablog.com