【问题标题】:Typecast String to ByteArray in kotlin在kotlin中将字符串类型转换为ByteArray
【发布时间】:2018-09-16 18:47:05
【问题描述】:

我在 kotlin 中有字符串格式的变量:

var a ="[B@53c1c428"

我想将它的数据类型从 String 更改为 ByteArray,即将其类型转换为 ByteArray,有点像:

var b: ByteArray = a

我也试过了:

var b = a as ByteArray,但这会引发异常

如果我这样做:

var b = a.toByteArray(),我得到如下输出:

[B@3aea9e4

但我希望 [B@53c1c428ByteArray

有什么建议吗?

【问题讨论】:

  • 这是 ByteArray 的 toString() 表示(而在 Java 中是 Byte[]),您无法仅使用 toString() 表示来恢复您的数组。
  • 可能你想用String(myByteArray)从字节数组创建字符串。
  • “我想要 [B@53c1c428 as ByteArray”——你希望 ByteArray 在这样的演员之后有什么内容?即那个 ByteArray 的长度是多少,它的元素是什么?
  • 一般来说,任何时候你看到[B@3aea9e4这样的东西,你所拥有的都是毫无意义的。您也许可以将无意义的数据无错误地转换为其他无意义的数据,但这并不意味着它有意义。

标签: arrays string kotlin


【解决方案1】:

只是为了澄清: [B@53c1c428 是该对象的十六进制哈希码,带有 B[@ 前缀。字符串"[B@53c1c428" 本身不包含重构ByteArray 所需的数据。


考虑一下:

val str = "Test"
val byteArray = str.toByteArray()
println(Integer.toHexString(byteArray.hashCode())) // 1f32e575
println(byteArray) // [B@ + hash code as hexadecimal representation

val str2 = "This is a really long text and no 8 digit hex number in this world could encode it."
val byteArray2 = str2.toByteArray()
println(Integer.toHexString(byteArray2.hashCode())) // 279f2327
println(byteArray2) // [B@ + hash code as hexadecimal representation

toByteArray() 已经给你一个ByteArray。如果要将单个数字打印为整数,请执行以下操作:

val str = "Test"
println(str.toByteArray().joinToString(" "){ "$it" })

输出:

84 101 115 116

这个输出足以完全恢复ByteArray,因为它包含所有必要的信息。

【讨论】:

  • 我得到如下输出:91 66 64 53 51 99 49 99 52 50 56。如何将其转换为如下格式:[B@53c1c428?
  • @troy_achilies 查看我的更新:例如,使您的 ByteArray 非常长。假设 1024 KB。如果你在它上面调用 toString(),表示应该会变得更长,不是吗?但它没有!
  • @troy_achilies 你为什么想要那个?再读一遍答案。 [B 表示:该对象是一个字节数组。 @53c1c428 是字节数组的 hashCode。它不是字节数组的内容。如果你在一个有 100 万个值的字节数组上调用 toString(),你只会得到那几个字符。仅仅从这几个字符中取回百万字节显然是不可能的。
  • 但如果我这样做:java.math.BigInteger(1,[B@53c1c428).toString(16),我会得到一个合法的字符串,我认为这不是参考。
  • @JBNizet 我更新了关于它不是参考而是哈希码的答案。谢谢
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2016-06-04
  • 2021-04-16
  • 1970-01-01
相关资源
最近更新 更多