2011-12-07 12 views
9

एक बाइटिंगिंग निबेलवाइड का इलाज करने और अपने हेक्साडेसिमल (0-एफ) प्रतिनिधित्व को सुंदर प्रिंट करने का एक बेवकूफ तरीका क्या है?सुंदर प्रिंट बाइटस्ट्रिंग हेक्स निबल-वार

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'] 

मैं Munge सकता है [ "1" , "7e"] लेकिन वह स्ट्रिंग मैनिपुलेशन जबकि मैं चाहता था बल्कि संख्यात्मक हेरफेर करते हैं। क्या मुझे संख्यात्मक मूल्यों को स्थानांतरित करने और मास्क करने के लिए नीचे जाने की आवश्यकता है?

उत्तर

10

मैं अधिकतम taldykin के जवाब पर विस्तृत करने के (है कि मैं upvoted है) है, जो मुझे लगता है कि अधिक-जटिल है चाहते हैं। 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] 
+1

+1, बस 'संक्षिप्त' का उल्लेख करना चाहते हैं। नक्शा' == 'concatMap' –

+8

आप यहां परिणाम को गड़बड़ कर देंगे क्योंकि 'शोहेक्स' 2 तक पैड नहीं होगा। – Peaker

+0

@ पेकर सही है, यह समाधान गलत है। यह किसी भी अग्रणी शून्य को काटता है। नीचे क्रॉकीया का जवाब सही है। –

3

आप ["1","7e"] :: [स्ट्रिंग] concat ["1", "7e"]"17e" :: String जो [चार] के बराबर और ['1','7','e'] :: [Char] समान हो जाता है की है।

से आप टुकड़ों में है कि स्ट्रिंग विभाजित हो सकता है:

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

'डेटा.लिस्ट.प्लिट.splitEvery 1' ==' मानचित्र (: []) ' –

4

somethig इस तरह:

{-# 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 ओह, वहाँ एक मूर्ख स्मृति है रिसाव: निश्चित रूप से आपकोके साथ प्रतिस्थापित करना चाहिए(क्योंकि आलस्य यहाँ आवश्यक नहीं है):

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

बेशक 'फ़ोल्ड' संस्करण बाइट्स को रिवर्स ऑर्डर," छोटी-एंडियन "शैली में प्रिंट करता है। – crockeea

5

अब आप Data.ByteString.Builder उपयोग कर सकते हैं:

यहाँ मेरी संस्करण है। (सही क्रम में बाइट प्रति दो हेक्स अंक के साथ,, और कुशलता से) ने अपने हेक्स बराबर करने के लिए एक ByteString प्रिंट के लिए, बस का उपयोग करें:

toLazyByteString . byteStringHex 

या

toLazyByteString . lazyByteStringHex 

आधार ByteString का जो स्वाद पर आप इनपुट के रूप में है।

संबंधित मुद्दे