2016-10-20 3 views
0
私は2つの文字列の対応する文字をXORしようとしています。このコードでは

文字列内の文字を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) 

対応する文字列char値をXORし、リストに追加する方法は?

+0

なぜbase64に行くのですか? (BigInt(s1、16)^ BigInt(s2、16))。toString(16).toList'を使用するのはいいですか?あなたの例では、どのようなリストや文字列をxoringの結果にする必要がありますか? – Kolmar

+0

'foldLeft'の代わりに' map'を使うことができます。 – talex

+0

@Kolmar六角復号1c0111001f010100061a024b53535009181cと686974207468652062756c6c277320657965とXOR演算を生成すべきである746865206b696420646f6e277420706c6179参照:https://cryptopals.com/sets/1/challenges/2 –

答えて

1

あなたがやっていることは単純化することができます。

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

XORのOP(^)の結果はIntあります。 .toCharを追加してChar値に変更してください。

しかし、あなたが本当にやりたいことは、文字列として表現された2つの大きな16進数値をXORし、その結果を文字列として返すように思えます。これを行うには、必要なものはすべて...

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

Javaキャスト構文を使用します。 scallaでは、あなたはvar.asInstanceOf[Type]のようにキャストします。

(b._1^b._2).asInstanceOf[Char]である必要があります。

関連する問題