2016-02-28 138 views
2

我有一些代码看起来有点像什么是Haskell等价于Python的hexlify和unhexlify?

module Lib where 

import Data.ByteString (ByteString) 
import Data.ByteString.Lazy (fromStrict) 
import Data.Digest.Pure.SHA (sha1, showDigest) 

hash :: ByteString -> String 
hash bstring = showDigest $ sha1 $ fromStrict bstring 

,给了我一个SHA1哈希的十六进制字符串表示。我将如何在这个十六进制表示和二进制表示之间进行转换?在Python中,我会使用binascii.hexlifybinascii.unhexlify。例如:

'95d09f2b10159347eece71399a7e2e907ea3df4f' <=> '\x95\xd0\x9f+\x10\x15\x93G\xee\xceq9\x9a~.\x90~\xa3\xdfO' 
+0

你能给什么样的输入/输出你所期望的一些例子吗? – epsilonhalbe

+1

第一次猜测将在'Data.Bytestring.Lazy'中用'pack' /'unpack'进行编辑 – epsilonhalbe

+0

用示例进行编辑。 –

回答

6

我通常称之为基16编码,并且它也可用于Python作为base64.b16decode()base64.b16encode()。术语“hexlify”和“unhexlify”似乎有点特别。

使用这些搜索条件,我可以在Hackage中找到base16-bytestring。它消耗并返回ByteString,而不是String,因此如果您有String,则需要打包。

以下是您如何使用它。你可以看到它有一个稍微不同的接口,并且Haskell以不同的方式转义字符串,但它给出了你在示例中给出的相同结果。

> decode "95d09f2b10159347eece71399a7e2e907ea3df4f" 
("\149\208\159+\DLE\NAK\147G\238\206q9\154~.\144~\163\223O","") 
> encode "\x95\xd0\x9f+\x10\x15\x93G\xee\xceq9\x9a~.\x90~\xa3\xdfO" 
"95d09f2b10159347eece71399a7e2e907ea3df4f" 
+0

我认为这与我所寻找的略有不同。 –

+0

@VaibhavSagar:我写了一个例子来向你展示它是如何工作的。 –

+0

这是完美的,谢谢! –

-1
from encodings.hex_codec import binascii 

value = binascii.a2b_hex('95d09f2b10159347eece71399a7e2e907ea3df4f') 
+0

我已经知道如何在Python中做到这一点:)。 –

+0

@VaibhavSagar哦,对不起。我读得太快,理解完全相反。 –

1

我无法找到一个包,这样做是为了我,让我滚我自己:

import Data.ByteString (pack, unpack) 
import Numeric (showHex, readHex) 

unhexlify :: String -> ByteString 
unhexlify hexstr = let bytes = pairs hexstr 
         nums = map fst $ concatMap readHex bytes 
        in pack nums 

hexlify :: ByteString -> String 
hexlify binstr = let nums = unpack binstr 
        hex = map showHex nums 
       in foldr ($) "" hex 

pairs :: String -> [String] 
pairs [] = [] 
pairs (x:y:xs) = [x,y]:pairs xs 
相关问题