漂亮的打印ByteString到十六进制半字节

xrl*_*xrl 12 hex haskell pretty-print bytestring

什么是一个惯用的方法来处理字节串nibblewise和漂亮打印其十六进制(0-F)表示?

putStrLn . show . B.unpack
-- [1,126]
Run Code Online (Sandbox Code Playgroud)

其中,经过进一步的工作

putStrLn . show . map (\x -> N.showIntAtBase 16 (DC.intToDigit) x "") . B.unpack
["1","7e"]
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是

["1","7","e"]
Run Code Online (Sandbox Code Playgroud)

或者更好

['1','7','e']
Run Code Online (Sandbox Code Playgroud)

我可以捣乱["1","7e"]但是那个字符串操作,而我宁愿做数字操作.我是否需要下拉移动和屏蔽数值?

cro*_*eea 13

你现在可以使用了Data.ByteString.Builder.要将a打印ByteString到其十六进制等效值(每个字节有两个十六进制数字,按正确的顺序,并且有效),只需使用:

toLazyByteString . byteStringHex
Run Code Online (Sandbox Code Playgroud)

要么

toLazyByteString . lazyByteStringHex
Run Code Online (Sandbox Code Playgroud)

取决于ByteString你的味道作为输入.


lbo*_*lla 10

我想详细说明max taldykin的答案(我已经投票),我认为这个答案过于复杂.没有必要NoMonomorphismRestriction,printfData.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]
Run Code Online (Sandbox Code Playgroud)

  • 你会把结果搞乱,因为`showHex`不会填充到2. (10认同)