【发布时间】:2021-02-04 04:46:59
【问题描述】:
今天早上我尝试将一个 byteArray 转换为 String 并将其重新转换为一个 byteArray,但我注意到我得到了一些额外的字节,所以我得出结论我不能使用这些基本的东西。
有人可以解释一下为什么吗?因为基本上 String 是一个字节序列,所以是一个 byteArray,对吧?
我需要将我的 byteArray 转换为 String 以将其存储在 dataStore (androidStudio) 中,并在需要使用时将其返回 byteArray... 如果有人有办法做到这一点
token.accessTokenCipher = Pair<ByteArray, ByteArray>
println("RAW ${token.accessTokenCipher.first.size} - AccessCipher : "+token.accessTokenCipher.first)
println("RAW ${token.accessTokenCipher.second.size} - AccessIV : "+token.accessTokenCipher.second)
println("Decrypt : "+Token.getAccessTokenCipher(Pair(token.accessTokenCipher.first,token.accessTokenCipher.second)))
val a = token.accessTokenCipher.first.toString(Charsets.UTF_8)
val q = token.accessTokenCipher.second.toString(Charsets.UTF_8)
println("STR - AccessCipher : "+a)
println("STR - AccessIV : "+q)
val p = a.toByteArray(Charsets.UTF_8)
val o = q.toByteArray(Charsets.UTF_8)
println("BA ${p.size} - AccessCipher : "+p)
println("BA ${o.size} - AccessIV : "+o)
println("Decrypt : "+Token.getAccessTokenCipher(Pair(p,o))))
【问题讨论】:
-
您是否考虑过可能对内容使用不同或不受支持的编码?
-
"String 是一个字节序列" - 不是真的。字符串是一个字符序列。对于从字节到字符的映射,有不同的编码,可能是也可能不是完全双向的
-
请发布一些重现您的问题的代码。你在某个地方犯错的机会比一个已经持续支持和更新了 25 年的东西要多。
-
除非从文本开始,否则不要使用字符串编码。在这里,你从 bytes 开始,所以你应该改用 Base64。
-
您的字节数组包含无效的 UTF-8 内容。使用字符串构造函数时,无效字节被替换。将结果转换为 UTF-8 时,您会得到一个有效的 UTF-8 序列,其中包含替换字符的 UTF-8 表示。您可以改用 ISO-8859-1 aka ISO-LATIN-1,它具有每个字节值都映射到一个字符的属性,因此可以来回转换。但是,如果您打算将其作为文本传输,则可能会丢失数据,因为不能保证任何字符都可以安全传输。那么,Base64 是更好的选择。
标签: java android-studio kotlin jvm