2016-02-28 135 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 
相關問題