如何在字符串中xor char并添加到List?

时间:2016-10-20 13:50:53

标签: scala

在这段代码中我试图xor两个字符串的相应字符:

val s1 = "1c0111001f010100061a024b53535009181c";
val s2 = "686974207468652062756c6c277320657965";
val base64p1 = Base64.getEncoder().encodeToString(new BigInteger(s1, 16).toByteArray())
val base64p2 = Base64.getEncoder().encodeToString(new BigInteger(s2, 16).toByteArray())
val zs : IndexedSeq[(Char, Char)] = base64p1.zip(base64p2);
val xor = zs.foldLeft(List[Char]())((a: List[Char] , b: (Char, Char)) =>  ((Char)((b._1 ^ b._2))) :: a)

产生错误:

Char.type does not take parameters
[error]         val xor = zs.foldLeft(List[Char]())((a: List[Char] , b: (Char, Char)) =>  ((Char)((b._1 ^ b._2))) :: a)

如何xor相应的字符串char值并将它们添加到List?

2 个答案:

答案 0 :(得分:1)

您使用java强制转换语法。在scalla中,你像var.asInstanceOf[Type]一样投射。

应为(b._1 ^ b._2).asInstanceOf[Char]

答案 1 :(得分:1)

您正在做的事情可以简化。

val xor = base64p1.zip(base64p2).map{case (a,b) => (a^b).toChar}.reverse

XOR操作(^)的结果是Int。只需添加.toChar即可将其更改为Char值。

但看起来你真正想做的是XOR两个表示为字符串的大十六进制值,然后将结果作为字符串返回。为此,您只需要......

val (v1, v2) = (BigInt(s1, 16), BigInt(s2, 16))
f"${v1 ^ v2}%x"  // res0: String = 746865206b696420646f6e277420706c6179