xoring或十六进制解码代码中的错误

时间:2013-09-16 18:47:14

标签: scala

有人可以在下面的代码中提出我的错误。我希望在做的时候

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

s1.length == s2.lengths1s2被赋予十六进制编码字符串,输出应该是 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。

2 个答案:

答案 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中所做的。