什么是一种习惯的方式来处理字节串,并漂亮地打印它的十六进制(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”,“7 e”],但字符串操作,而我更喜欢数字操作。我需要下拉到移位和掩码数值吗?
5条答案
按热度按时间klr1opcd1#
现在可以使用
Data.ByteString.Builder
了。要将ByteString
打印成它的十六进制等价物(每个字节有两个十六进制数字,顺序正确,而且效率高),只需用途:或
这取决于输入的
ByteString
的风格。ctehm74n2#
我想详细说明一下max taldykin的答案(我已经投了赞成票),我认为这个答案太复杂了,没有必要用
NoMonomorphismRestriction
,printf
或Data.List
。以下是我的版本:
osh3o9ms3#
像这样:
测试项目:
更新哦,有一个愚蠢的内存泄漏:当然,您应该将
foldr
替换为foldl'
(因为这里不需要懒惰):7tofc5zh4#
您有
["1","7e"]
::[字符串]concat ["1", "7e"]
是"17e" :: String
,它等于[字符]和['1','7','e'] :: [Char]
。然后你可能会分裂成几部分字符串:
zsbz8rwp5#
如果你只想对ByteString进行常规的十六进制编码/解码,你可以使用内存包。他们把十六进制编码称为Base 16。
完整文档:https://hackage.haskell.org/package/memory-0.18.0/docs/Data-ByteArray-Encoding.html#t:Base