Kotlin: Почему размер ByteArray отличается после преобразования в строку?

Я разрабатываю приложение Kotlin для Android, и по разным причинам мне нужно преобразовать ByteArray в String и наоборот. Однако, когда я конвертирую ByteArray в String, а затем возвращаюсь к ByteArray, размер последнего ByteArray отличается от размера исходного ByteArray.

Вот мой код:

private lateinit var sessionKey: ByteArray

private fun genSessionKey() {
    val r = SecureRandom()
    sessionKey = ByteArray(16)
    r.nextBytes(sessionKey)
    println("sessionkey size in genSessionKey() : ${sessionKey.size}")
    val sessionkeyInString = sessionKey.toString(Charsets.UTF_8)
    println("sessionkey size in genSessionKey() after conversion : ${sessionkeyInString.toByteArray(Charsets.UTF_8).size}")
}

И вот что у меня на выходе:

I/System.out: sessionkey size in genSessionKey() : 16
I/System.out: sessionkey size in genSessionKey() after conversion : 30

Я предполагаю, что это вопрос кодирования, но я не уверен, в чем моя ошибка?

В строках utf-8 символы представлены от 1 до 5 байт каждый. Ваш массив байтов содержит значения, отличные от кодов ansi. Все эти разные коды преобразуются как минимум в два байта.

blackapps 23.12.2020 18:00
1
1
1 482
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Значения каждого байта в sessionKey могут быть любыми значениями от 0 до 255. Когда вы затем преобразуете это в String с использованием кодировки UTF-8, вы получите String, содержащее любое количество символов (в зависимости от того, как случайные байты сопоставляются с кодировка). Также возможно, что некоторые последовательности байтов вообще не могут быть преобразованы в символы String, потому что не все последовательности байтов являются допустимыми символами UTF-8.

Не делай этого. Это ненадежный способ преобразования между байтовыми значениями и String. Если вам нужно строковое представление группы байтов, вы должны преобразовать каждое из них в 2-символьные шестнадцатеричные значения, например «0b» или «26», и создать из них String.

Хорошо, я понимаю! Спасибо за помощь!

Martin Denion 23.12.2020 18:44

Если этот ответ был полезен, вы можете «принять» его, нажав зеленую галочку рядом с ответом.

David Wasser 23.12.2020 21:07

Другие вопросы по теме