1

以下のコードで私のエラーが何であるかを誰かが提案できますか。私はそれをするときにそれを期待します

stringXor(hexDecode(s1), hexDecode(s2)) 

s1.length == s2.lengthおよびが16 進数でエンコードされた文字列を指定されs1ている場合、出力は半分s2(EDITED) の長さのリストになるはずですが、これは repl で再生する場合には当てはまりません。

def stringXor(fst: String, snd: String): String = {
  val charInts = (fst.toList, snd.toList).zipped map (_ ^ _)
  charInts.map(_.toChar).toString
}

def hexDecode(s: String): String = {
  hexDec(s.toList).toString
}

def hexDec(s: List[Char]): List[Char] = {
  if (s.length == 0)
    return Nil
  val parts = s.splitAt(2)
  dehex(parts._1) :: hexDec(parts._2)
}

def dehex(cs: List[Char]): Char = {
  (Character.digit(cs.head, 16) * 16 + Character.digit(cs.last, 16)).toChar
}

編集:私は今、repl でいくつかの短い文字列を試しています。s1 = "6558333946494f6e487a6c617645783474653745394f41307143733030356a7331695a3474745437654b58344a42415a6f35"s2 = "5230744346396f6d53776e70425064303039386f5752465a72363944757a3965697847307734364d52426b595532554c7a68"

すると、2 つの文字列の長さが 100res0.lengthになります。466

4

2 に答える 2

0

これは確かに少し奇妙です。自分でコードを少しいじった後、次のことに気付きました。

$ hexDecode(s1)
res48: String = List(e, X, 3, 9, F, I, O, n, H, z, l, a, v, E, x, 4, t, e, 7, E, 9, O, A, 0, q, C, s, 0, 0, 5, j, s, 1, i, Z, 4, t, t, T, 7, e, K, X, 4, J, B, A, Z, o, 5)
$ res48.length
res49: Int = 154

待って、それは正しくありません。そして、それは私を襲った:D

hexDec(s.toList).toString

toString文字列表現を生成しますが、必要なものではありません。List(多くのスペースなどを含む文字列を返します。あなたが欲しいのはですmkString。そして出来上がり:

def hexDecode(s: String): String = {
  hexDec(s.toList).mkString
}

結果:

res1: String = eX39FIOnHzlavEx4te7E9OA0qCs005js1iZ4ttT7eKX4JBAZo5

補足として、あなたの関数の命名は本当に素晴らしいものではありません:D また、余分なメソッドhexDecodeを避けるために次のことを行うことができます:hexDec

def hexDecode(s: String): String = {
  s.toList.sliding(2,2).flatMap(x => hexDec(x)).mkString
}

slidingリストの上にサイズ 2 のスライディング ウィンドウを作成します。これはまさに で行うことですhexDec

于 2013-09-16T20:21:14.277 に答える