将字节数组转换为字符串

52

我的Scala代码从字节流中接收到一个二进制数据,它看起来像[61 62 63 64]。其内容是“abcd”。 我使用toString将其转换为字符串,但失败了。 如何将其打印为字符串?


1
尝试将每个数字解析为字符并将它们连接起来以形成一个字符串。 - Quentin
将字节数组转换为字符串 - Sameera.San
2
可能是字节数组转字符串和反向操作.. -127的问题的重复问题。 - Alexander Azarov
3个回答

104

如果您知道字节数组的字符集,您可以将其转换为字符串。

val str = new String(bytes, StandardCharsets.UTF_8)

如果您未指定任何字符集,将使用默认的Charset


3
想知道哪种方法更好,(bytes.map(_.toChar)).mkString 还是 new String(bytes)?建议版本:想知道哪种更好,(bytes.map(_.toChar)).mkString 还是 new String(bytes) - BAE
2
@BAE 或许对您来说有点晚了,但两者可能会产生不同的结果。UTF-8 是一种可变长度编码,因此一个字符可以用一个字节或多个字节进行编码。UTF-8 以相同的方式对 ASCII 字符进行编码 (例如 A 在两者中都表示为 65),但大多数(也许全部?)其他字符都使用多个字节进行编码。简而言之,如果您的字符串只包含 ASCII 字符,则它们相同,否则将产生不同的结果。 - Micheal Hill
@MichealHill 假设流是UTF-8流对于现在的文本负载来说是相当合理的。原始问题要求打印“二进制”字节流,这种情况并不意味着字符串编码。这就是为什么在传输字符串时最好提供编码的原因。(如果您有一个没有指定编码的文本流,则可以使用频率分析来推断可能的字符串编码) - cms

31

您可以将字节数组转换为字符数组,然后从中构建字符串

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> 

6
如下评论中 @michael-hill 已经提到,这可能会导致问题,因为它假设您使用的是 ASCII 而不是 UTF-8 或其他字符编码。如果您尝试将以下(正确的)UTF-8字节数组转换为字符串... val msg = Array[Byte](-17, -69, -65, 72, 101, 108, 108, 111) (msg.map(_.toChar)).mkString您将得到一个看起来非常奇怪的东西,而不是从new String(msg)得到的期望的“Hello”。 - Murray Todd Williams
2
就像 @cms 所说,这真的是个糟糕的建议。请不要这样做。这会导致数据静默损坏和其他难以追踪的错误。 - Jacob Wang
1
println("".getBytes(StandardCharsets.UTF_8).length)输出结果为4。 - tgrrr

-2
我正在寻找的字节转字符串函数是,每个字节只是表示为一个字符串的数字值,没有任何暗示的编码。多亏了这里提供的建议,我最终得到了适合我用途的以下函数。我在此发帖,以防其他人有用。

  def showBytes(bytes: Array[Byte]):String = {
    bytes.map(b => "" + b.toInt).mkString(" ")
  }

此函数将返回一个包含以空格分隔的数字值的字符串。


2
两件事情:1-我不明白所有类型转换的目的。为什么不直接使用 bytes.mkString(" ")?2-这个答案不合适。它没有回答所问的问题。 - jwvh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接