我在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
语句,但我想如何更改脚本以接受十六进制值?
答案 0 :(得分:3)
正如@gspr建议的那样,解决这个问题的方法是将其分解为更小的部分:
"BD 9E CF CF CF CF CF CF"
转换为["BD", "9E", ...., "CF", "CF"]
。对于1,words
功能可能会有所帮助。
2,read "0xBD" == 189
。您只需要弄清楚如何将每个十六进制数字设置为read
的正确格式。 (注意,您也可以编写转换函数直接从字符串转换为整数,这可能是一个很好的练习。)
对于3,只需反转编码操作,即:编写等式i = y - x - 2 (mod 256)
(其中i
是从十六进制转换的那个,y
是列表中的索引,并且x
是字符的值)并解析x
。 chr
与ord
相反。