1

有人可以在下面的代码中建议我的错误是什么。我希望在做的时候

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

使用s1.length == s2.lengthands1s2给出十六进制编码的字符串,输出应该是一半(已编辑)长度的列表,但这在 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"

当我这样做时,res0.length我得到466两个字符串的长度为 100。

4

2 回答 2

0

您的hexDecode函数正在返回您的文字String对象List[Char]

scala> hexDecode(s1)
res8: 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)

这是一个简单的快速修复:

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

scala> hexDecode(s1)
res12: String = eX39FIOnHzlavEx4te7E9OA0qCs005js1iZ4ttT7eKX4JBAZo5
于 2013-09-16T20:20:11.900 回答
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 回答