12
votes

Jolie imprimé bytrestring à hexagonal sage

Qu'est-ce qu'un moyen idiomatique de traiter un grignotage bytés et jolie à imprimer sa représentation hexadécimale (0-f)? XXX PRE>

Qui, sur le travail supplémentaire P>

['1','7','e']


0 commentaires

4 Réponses :


3
votes

Vous avez ["1", "7e"] :: [string] concat ["1", "7e"] est "17e" :: chaîne qui est égal à [char] et égal à ['1', ' 7 ',' E '] :: [Char] .

que vous ne pouvez diviser cette chaîne en morceaux: xxx


1 commentaires

data.list.split.splitevery 1 == carte (: [])



4
votes

quelque chose comme ceci: xxx pré>

test: p> xxx pré>

upd strong> oh, il y a une mémoire stupide Fuite: Bien sûr, vous devriez remplacer plier code> avec replier ' code> (car la paresse n'est pas requise ici): P>

hex = foldl' (flip showHex) "" . B.unpack


1 commentaires

Bien sûr, la version FLETL ' imprime les octets dans l'ordre inverse, le style "Little-Endian".



9
votes

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 nomonomorphistressress code>, printf code> ou data.list code>.

Voici ma version: p>

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]


2 commentaires

Vous allez gâcher le résultat ici depuis showhex 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.



15
votes

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


0 commentaires