2016-10-20 4 views
0

In diesem Code, wo ich bin versucht, die entsprechenden Zeichen von zwei Strings xor:Wie xor char in Zeichenfolge und zur Liste hinzufügen?

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) 

produziert Fehler:

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) 

Wie die entsprechenden Zeichenfolge char Werte XOR- und fügen Sie sie zur Liste?

+0

Warum gehst du zu base64? Ist es nicht in Ordnung, '(BigInt (s1, 16)^BigInt (s2, 16)) zu verwenden? ToString (16) .toList'? Welche Liste oder Zeichenfolge sollte in Ihrem Beispiel das Ergebnis des Xorings sein? – Kolmar

+0

Sie können 'map' anstelle von' foldLeft' verwenden. – talex

+0

@Kolmar hex Dekodierungs 1c0111001f010100061a024b53535009181c und XOR-verknüpft mit 686974207468652062756c6c277320657965 sollte produzieren 746865206b696420646f6e277420706c6179 Referenz: https://cryptopals.com/sets/1/challenges/2 –

Antwort

1

Was Sie tun, kann vereinfacht werden.

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

Das Ergebnis des XOR-op (^) ein Int. Fügen Sie einfach .toChar hinzu, um es in einen Char Wert zu ändern.

Aber es sieht so aus, als ob Sie wirklich wollen, XOR zwei große Hex-Werte, die als Zeichenfolgen dargestellt werden, und dann das Ergebnis als Zeichenfolge zurückgeben. Um das zu tun, brauchst du nur ...

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

Sie verwenden Java Casting Syntax. In scalla machst du wie var.asInstanceOf[Type].

Sollte (b._1^b._2).asInstanceOf[Char] sein.