どうしても至る所で使うことになりそうな気がするので、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