【问题标题】:Why the JVM can't convert a byteArray to String and reconvert to byteArray [duplicate]为什么JVM不能将字节数组转换为字符串并转换为字节数组[重复]
【发布时间】: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


【解决方案1】:

小例子如何处理

public class ByteArrays {
    public static void main(String[] args) {
        String myString = "This is a nice String :D";
        byte[] bytesOfmyString = myString.getBytes();
        System.out.println(Arrays.toString(bytesOfmyString)); // -> [84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 110, 105, 99, 101, 32, 83, 116, 114, 105, 110, 103, 32, 58, 68]
        System.out.println(new String(bytesOfmyString)); // -> This is a nice String :D
        
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多