什么是惯用的方法来处理字节串nibblewise并相当打印其十六进制(0-F)表示?
putStrLn . show . B.unpack
-- [1,126]
在进一步的工作中
putStrLn . show . map (\x -> N.showIntAtBase 16 (DC.intToDigit) x "") . B.unpack
["1","7e"]
但我真正想要的是
["1","7","e"]
或者更好
['1','7','e']
我可以捣乱[“1”,“7e”]但是那个字符串操作,而我宁愿做数字操作。我是否需要下拉移动和屏蔽数值?
答案 0 :(得分:11)
我想详细说明max taldykin的答案(我已经投票),我认为这是过于复杂的。不需要NoMonomorphismRestriction
,printf
或Data.List
。
这是我的版本:
import qualified Data.ByteString as B
import Numeric (showHex)
prettyPrint :: B.ByteString -> String
prettyPrint = concat . map (flip showHex "") . B.unpack
main :: IO ()
main = putStrLn . prettyPrint . B.pack $ [102, 117, 110]
答案 1 :(得分:11)
您现在可以使用Data.ByteString.Builder
。要将ByteString
打印到其十六进制等效值(每个字节有两个十六进制数字,按正确的顺序,并且有效),只需使用:
toLazyByteString . byteStringHex
或
toLazyByteString . lazyByteStringHex
取决于您输入的ByteString
的味道。
答案 2 :(得分:4)
Somethig喜欢这样:
{-# LANGUAGE NoMonomorphismRestriction #-}
import qualified Data.ByteString as B
import Text.Printf
import Data.List
import Numeric
hex = foldr showHex "" . B.unpack
list = printf "[%s]" . concat . intersperse "," . map show
测试:
> let x = B.pack [102,117,110]
> list . hex $ x
"['6','6','7','5','6','e']"
更新哦,有一个愚蠢的内存泄漏:当然你应该用foldr
替换foldl'
(因为这里不需要懒惰):
hex = foldl' (flip showHex) "" . B.unpack
答案 3 :(得分:3)
你有["1","7e"]
:: [String]
concat ["1", "7e"]
为"17e" :: String
,等于[Char]且等于['1','7','e'] :: [Char]
。
您可以将该字符串拆分为多个部分:
> Data.List.Split.splitEvery 1 . concat $ ["1", "7e"]
["1","7","e"]
it :: [[Char]]