有人可以在下面的代码中提出我的错误。我希望在做的时候
stringXor(hexDecode(s1), hexDecode(s2))
s1.length == s2.length
且s1
和s2
被赋予十六进制编码字符串,输出应该是 half (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"
。
当我res0.length
时,我得到466
,两个字符串的长度为100。
答案 0 :(得分: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
答案 1 :(得分: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
中所做的。