将字节数组转换为字符串

Rob*_*bin 22 arrays string encoding scala bytestream

我的Scala代码从字节流接收二进制文件,它看起来像[61 62 63 64].内容是"abcd".我使用toString将其转换为p,但失败了.如何将其打印为字符串?

Sle*_*idi 44

如果你知道它的字符集,你总是可以将字节数组转换为字符串,

val str = new String(bytes, StandardCharsets.UTF_8)
Run Code Online (Sandbox Code Playgroud)

Charset如果您未指定任何默认值,则使用默认值.

  • 好奇哪个方法更好,`(bytes.map(_.toChar)).mkString` 还是 `new String(bytes)`? (3认同)
  • @BAE 这对你来说可能有点晚了;但两者可能会产生不同的结果。UTF-8 是一种可变宽度编码,因此单个字符可以用单个字节或多个字节进行编码。UTF-8 以相同的方式对 ASCII 字符进行编码(例如,`A` 在两者中都由 `65` 表示),但大多数(也许是全部?)其他具有多个字节的字符。简而言之; 如果您的字符串仅包含 ASCII 字符,则它们是相同的,否则会产生不同的结果。 (2认同)

cms*_*cms 22

您可以将字节数组转换为char数组,然后从中构造一个字符串

scala> val bytes = Array[Byte]('a','b','c','d')
bytes: Array[Byte] = Array(97, 98, 99, 100)

scala> (bytes.map(_.toChar)).mkString 
res10: String = abcd

scala> 
Run Code Online (Sandbox Code Playgroud)

  • 正如@michael-hill 在下面的评论中已经提到的那样,这可能会导致问题,因为它假设您使用的是 ASCII 而不是 UTF-8 或其他一些字符编码。如果您尝试将以下(正确的)UTF-8 字节数组转换为字符串... `val msg = Array[Byte](-17, -69, -65, 72, 101, 108, 108, 111 )` `(msg.map(_.toChar)).mkString` 你会得到一些看起来很奇怪的东西,而不是你从中得到的预期的“Hello”:`new String(msg)` (3认同)
  • 正如@cms 所说,这确实是一个糟糕的建议。请不要这样做。这可能会导致静默数据损坏和其他难以追踪的错误 (2认同)