haskell中的十六进制值

时间:2012-12-13 11:35:38

标签: haskell

我在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语句,但我想如何更改脚本以接受十六进制值?

1 个答案:

答案 0 :(得分:3)

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

  1. 将每个十六进制与字符串隔离,即将"BD 9E CF CF CF CF CF CF"转换为["BD", "9E", ...., "CF", "CF"]
  2. 将十六进制字符串转换为整数,例如“BD” - > 189
  3. 将每个整数转换为适当的字符,例如189 - > “A”
  4. 对于1,words功能可能会有所帮助。

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

    对于3,只需反转编码操作,即:编写等式i = y - x - 2 (mod 256)(其中i是从十六进制转换的那个,y是列表中的索引,并且x是字符的值)并解析xchrord相反。