我的代码看起来有点像
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.hexlify
和binascii.unhexlify
。例如:
'95d09f2b10159347eece71399a7e2e907ea3df4f' <=> '\x95\xd0\x9f+\x10\x15\x93G\xee\xceq9\x9a~.\x90~\xa3\xdfO'
答案 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')