12

バイトストリングをニブルで扱い、16進数(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"]を操作することはできますが、その文字列操作は数値操作を行います。数値のシフトとマスキングにドロップダウンする必要がありますか?

4

4 に答える 4

15

これで、を使用できますData.ByteString.Builder。aByteStringを16進数に相当する値(1バイトあたり2桁の16進数で、正しい順序で効率的に)に出力するには、次のコマンドを使用します。

toLazyByteString . byteStringHex

また

toLazyByteString . lazyByteStringHex

ByteString入力として持っているフレーバーによって異なります。

于 2016-02-24T14:29:26.443 に答える
9

マックス・タルディキンの答え(私が賛成した)について詳しく説明したいと思いますが、これは複雑すぎると思います。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]
于 2011-12-07T13:37:44.843 に答える
4

このような何か:

{-# 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']"

Updああ、ばかげたメモリリークがあります:もちろん、次のように置き換える必要foldrfoldl'あります(ここでは怠惰は必要ないため):

hex = foldl' (flip showHex) "" . B.unpack
于 2011-12-07T09:22:33.027 に答える
3

["1","7e"]:: [String] は、[Char]concat ["1", "7e"]"17e" :: String等しく、 。と等しくなり['1','7','e'] :: [Char]ます。

あなたがその文字列を細かく分割するよりも:

> Data.List.Split.splitEvery 1 . concat $ ["1", "7e"]
["1","7","e"]
it :: [[Char]]
于 2011-12-07T09:19:41.470 に答える