1

我在haskell中有以下代码,我想对其进行一些更改:

 unwords . map (printf "%02X") $ zipWith (\x y -> -(fromIntegral (ord x)) + y - 2 :: Word8) "Aa123456" [0..]

运行此代码后,我得到:

"BD 9E CF CF CF CF CF CF"

基本上我想要这个函数的逆,所以函数可以获得十六进制值"BD 9E CF CF CF CF CF CF"并返回"Aa123456"

我确定我必须更改printf语句,但我应该如何更改脚本以接受十六进制值?

4

1 回答 1

3

正如@gspr 建议的那样,解决这个问题的方法是将其分成更小的部分:

  1. 将每个十六进制从字符串中分离出来,即"BD 9E CF CF CF CF CF CF"变成["BD", "9E", ...., "CF", "CF"].
  2. 将十六进制字符串转换为整数,例如 "BD" -> 189
  3. 将每个整数转换为适当的字符,例如 189 -> "A"

对于 1,该words功能可能会有所帮助。

对于 2 read "0xBD" == 189,。您只需要弄清楚如何将每个十六进制数转换为read. (注意,您也可以编写转换函数以直接从字符串转换为整数,这可能是一个不错的练习。)

对于 3,只需反转编码操作,即:写出你的方程i = y - x - 2 (mod 256)(其中i是从十六进制转换的一个,y是列表中的索引,x是字符的值)并求解x. 是的chr倒数。ord

于 2012-12-13T12:04:53.093 回答