Qu'est-ce qu'un moyen idiomatique de traiter un grignotage bytés et jolie à imprimer sa représentation hexadécimale (0-f)? Qui, sur le travail supplémentaire P> ['1','7','e']
4 Réponses :
Vous avez que vous ne pouvez diviser cette chaîne en morceaux: p> ["1", "7e"] code> :: [string]
concat ["1", "7e"] code> est
"17e" :: chaîne code> qui est égal à [char] et égal à
['1', ' 7 ',' E '] :: [Char] code>.
data.list.split.splitevery 1 code> ==
carte (: []) code>
quelque chose comme ceci: test: p> plier code> avec
replier ' code> (car la paresse n'est pas requise ici): P>
hex = foldl' (flip showHex) "" . B.unpack
Bien sûr, la version code> FLETL ' code> imprime les octets dans l'ordre inverse, le style "Little-Endian".
J'aimerais élaborer la réponse de Max Taldykin (que j'ai évoqué), ce qui, à mon avis, est trop compliqué. Il n'y a pas besoin de Voici ma version: p> nomonomorphistressress code>,
printf code> ou
data.list code>.
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]
Vous allez gâcher le résultat ici depuis showhex code> ne sera pas pavé sur 2.
@Peaker a raison, cette solution est incorrecte. Il coupe des zéros de premier plan. La réponse de Crockeea en bas est correcte.
Vous pouvez maintenant utiliser Données .Bytestring.builder code>
. Pour imprimer un bytestring code> à son équivalent hexillon (avec deux chiffres hexadécimaux par octet, dans le bon ordre, et efficacement), utilisez simplement:
toLazyByteString . lazyByteStringHex