scala-在字符串中快速构造十六进制表示的控制字符

时间:2019-04-30 13:47:23

标签: scala

我从应用程序的输出中得到一个字符串序列,该应用程序以“ \ x00”方法打印控件字符。例子

\x00R50\x00\x00\x00\x01

我通过一次检查char并将其添加到字节数组中,将其转换为REPL中的scala字符串。

scala> val ar:Array[Byte]=Array(0,82,53,48,0,0,1)
ar: Array[Byte] = Array(0, 82, 53, 48, 0, 0, 1)

scala> val a = ar.map(_.toChar).mkString
a: String = ?R50???

scala>

这似乎很费力。.是否有一种快速的方法可以如上所述将\x00R50\x00\x00\x00\x01转换为val a

2 个答案:

答案 0 :(得分:4)

java.lang.String中有一个构造函数:

public String(byte bytes[]) 
scala> new String(Array[Byte](0, 82, 53, 48, 0, 0, 1))
res0: String = ?R50???

答案 1 :(得分:2)

输入String仅需要遍历一次,但是每个Match都会经历几次转换。

val str = raw"\x00R50\x00\x00\x00\x01"

raw"\\x([0-9a-fA-F]{2})".r.replaceAllIn(str, m =>
    java.lang.Integer.parseInt(m.group(1),16).toChar.toString)
//res0: String = ?R50????

每个控件字符的值都会保留。