Я разрабатываю приложение 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
Я предполагаю, что это вопрос кодирования, но я не уверен, в чем моя ошибка?
Значения каждого байта в sessionKey
могут быть любыми значениями от 0 до 255. Когда вы затем преобразуете это в String
с использованием кодировки UTF-8, вы получите String
, содержащее любое количество символов (в зависимости от того, как случайные байты сопоставляются с кодировка). Также возможно, что некоторые последовательности байтов вообще не могут быть преобразованы в символы String
, потому что не все последовательности байтов являются допустимыми символами UTF-8.
Не делай этого. Это ненадежный способ преобразования между байтовыми значениями и String
. Если вам нужно строковое представление группы байтов, вы должны преобразовать каждое из них в 2-символьные шестнадцатеричные значения, например «0b» или «26», и создать из них String
.
Хорошо, я понимаю! Спасибо за помощь!
Если этот ответ был полезен, вы можете «принять» его, нажав зеленую галочку рядом с ответом.
В строках utf-8 символы представлены от 1 до 5 байт каждый. Ваш массив байтов содержит значения, отличные от кодов ansi. Все эти разные коды преобразуются как минимум в два байта.