什么是Haskell相当于Python的hexlify和unhexlify?

时间:2016-02-28 20:50:02

标签: python haskell

我的代码看起来有点像

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'

3 个答案:

答案 0 :(得分:6)

我通常称之为base-16编码,它也可以在Python中以base64.b16decode()base64.b16encode()形式使用。术语&#34; hexlify&#34;并且&#34; unhexlify&#34;似乎有点特殊。

使用这些搜索字词,我能够在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"

答案 1 :(得分: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

答案 2 :(得分:-1)

from encodings.hex_codec import binascii

value = binascii.a2b_hex('95d09f2b10159347eece71399a7e2e907ea3df4f')