2010-02-17 9 views
13

में एक इंटेगर को एक बाइटस्ट्रिंग में कैसे परिवर्तित करें हम एक विशिष्ट बाइनरी प्रारूप में डेटा को क्रमबद्ध करना चाहते हैं। हम Data.ByteString आंतरिक रूप से उपयोग करते हैं।हास्केल

तो, सवाल यह है कि: ByteString पर उपयोग किए जाने वाले विभिन्न डेटा प्रकारों को कैसे परिवर्तित करें। String के लिए हमें कोई समस्या नहीं है, हम encodeLazyByteString UTF8 "string" का उपयोग कर सकते हैं। लेकिन हम Integer से ByteString एस (बड़े-एंडियन) को भी कनवर्ट करना चाहते हैं।

क्या कोई जानता है कि यह कैसे करें और/या हास्केल और बाइनरी प्रारूपों का उपयोग करके कोई अच्छी युक्तियां हैं?

धन्यवाद!

उत्तर

12

Data.Binary के लिए एक आदर्श काम:

Prelude> :m + Data.Binary 
Prelude Data.Binary> encode (pi :: Double) 
Chunk "\SOH\SOH\NUL\NUL\NUL\NUL\NUL\NUL\NUL\a\CAN-DT\251!\EM\255\255\255\255\255\255\255\205" Empty 

Prelude Data.Binary> encode (42 :: Integer) 
Chunk "\NUL\NUL\NUL\NUL*" Empty 

आलसी bytestrings है, जो निश्चित रूप से सख्त वालों के लिए परिवर्तित किया जा सकता उपज के लिए। अनाज पैकेज एक ही इंटरफ़ेस प्रदान करता है, लेकिन केवल सख्त बाइटिंग्स उत्पन्न करता है (इसलिए एन्कोडिंग की कोई अनंत स्ट्रीमिंग नहीं)।

+0

कुछ "\ NUL" पैडिंग आगे क्यों हैं? क्या उन्हें हटाना संभव है? – lucian

+0

"पैडिंग" को बाइट्स की एक निश्चित संख्या में एन्कोड करने के लिए शामिल किया गया है। 'एन्कोड (42 :: Int8) 'आज़माएं और आपको कोई पैडिंग दिखाई नहीं देगी, उदाहरण के लिए। – Martijn

2

binary package, या इसके गैर-आलसी प्रकारों पर नज़र डालें: cereal या binary-strict

तीनों मामलों में, जब से तुम एक विशिष्ट द्विपदीय प्रारूप है, मैं प्रकार वर्ग Binary प्रत्येक में परिभाषित उपेक्षा चाहते हैं, और बजाय Put और Get monads वे परिभाषित करने पर ध्यान केंद्रित।