在这段代码中我试图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?
答案 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