2011-12-07 18 views
9

Nişasever bir yöntemle ve onaltılık (0-F) gösterimini güzel basmak için idiomatik bir yöntem nedir?Oldukça yazdır ByteString onaltılık bilge ile bilge

putStrLn . show . B.unpack 
-- [1,126] 

ayrıca iş başındayken Hangi

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

Ama ne gerçekten istiyorum

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

ben [ "1" yukarı gizleyin olabilir daha iyisi

["1","7","e"] 

Yoksa , "7e"] ama bu dize manipülasyonu yaparken ben yerine sayısal manipülasyon yapmak. Sayısal değerleri değiştirmek ve maskelemek için aşağıya inmem gerekiyor mu?

cevap

10

. NoMonomorphismRestriction, printf veya Data.List'a gerek yoktur.

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] 
+1

+1, sadece şunu söylemek istiyorum concat. map' == 'concatMap' –

+8

'showHex' 2'ye basmayacağından buradaki sonucu dağıtabilirsiniz. – Peaker

+0

@Peaker doğru, bu çözüm yanlış. Önde gelen sıfırları keser. crockeea'nın altındaki cevap doğrudur. –

3

Sen ["1","7e"] :: [dize] concat ["1", "7e"] [Char] eşit ve ['1','7','e'] :: [Char] eşittir "17e" :: String olduğunu var.

> Data.List.Split.splitEvery 1 . concat $ ["1", "7e"] 
["1","7","e"] 
it :: [[Char]] 
+5

'Data.List.Split.splitEvery 1' ==' harita (: []) 'Tabii ki –

4

somethig böyle:

{-# 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 

Testi:

> let x = B.pack [102,117,110] 
> list . hex $ x 
"['6','6','7','5','6','e']" 

Upd Ah, aptal bir hafıza var sen parçalar halinde o Dize bölünmüş olabilir Daha

sızıntı: tabikiile foldr değiştirmelisiniz(tembellik burada gerekli değildir çünkü):

hex = foldl' (flip showHex) "" . B.unpack 
Ben karmaşık aşırı olduğunu düşünüyorum, (ı upvoted ki) maksimum taldykin cevabı üzerinde durmak istiyorum
+0

' foldl'' versiyonu ters sırada bayt, "küçük-endian" tarzı yazdırır. – crockeea

5

Artık Data.ByteString.Builder kullanabilirsiniz:

İşte benim sürümüdür. (Verimli doğru sırada, bayt başına iki altıgen basamağı ile ve) onun onaltılık eşdeğer bir ByteString yazdırmak için, sadece kullanın:

toLazyByteString . byteStringHex 

veya

toLazyByteString . lazyByteStringHex 

bağlı ByteString hangi lezzet üzerine sen girdi var.