Конвертировать шестнадцатеричное значение в Base64 с помощью Kotlin - PullRequest
1 голос
/ 29 апреля 2019

У меня есть это значение:

263e5df7a93ec5f5ea6ac215ed957c30

Когда я заполняю это на: https://8gwifi.org/base64Hex.jsp (Hex to Base64) Это возвращает мне:

Jj5d96k+xfXqasIV7ZV8MA==

Этоэто ожидаемое значение.Однако, когда я пытаюсь это сделать в Kotlin,

val encodedHexB64 = Base64.encodeToString("263e5df7a93ec5f5ea6ac215ed957c30".toByteArray(UTF_8), Base64.NO_WRAP)

Это возвращает меня:

MjYzZTVkZjdhOTNlYzVmNWVhNmFjMjE1ZWQ5NTdjMzA=

Как получить правильное значение в Kotlin?

1 Ответ

1 голос
/ 29 апреля 2019

Похоже, что входная строка представляет 16 байтов, где каждый байт кодируется двумя шестнадцатеричными символами этой строки.

Напротив toByteArray(UTF_8) кодирует строку в кодировке UTF-8, превращая каждый символ в один или несколько байтов. Когда вы конвертируете эти байты в base64, сначала вы получите более длинный результат, а во-вторых - это совершенно разные байты.

Полагаю, правильный способ преобразования входной шестнадцатеричной строки в байтовый массив:

    val input = "263e5df7a93ec5f5ea6ac215ed957c30"
    val bytes = input.chunked(2).map { it.toInt(16).toByte() }.toByteArray()

Затем вы кодируете эти bytes в base64 как обычно.

...