2011-06-09 21 views
6

से इन्ट्स का पठन अनुक्रम मेरे पास एक बाइनरी फ़ाइल है जिसमें 32-बिट इन्स का अनुक्रम होता है। मैं उन्हें एक सूची में पढ़ने के बारे में कैसे जा सकता हूं (या डेटा.एरे, जिसे मैं शायद उपयोग कर दूंगा)?बाइनरी फ़ाइल

सब कुछ मैं दस्तावेज में पा सकता हूं यह एचजीईटीबीएफ फ़ंक्शन है, और यह स्पष्ट नहीं है कि इसका उपयोग कैसे करें (एक बफर को एक पीआरटी की आवश्यकता है?)। http://www.haskell.org/ghc/docs/latest/html/libraries/base-4.3.1.0/System-IO.html#v:hGetBuf

निश्चित रूप से एक साधारण दृष्टिकोण होना चाहिए, लेकिन मुझे यह नहीं मिल रहा है!

उत्तर

4

यदि फ़ाइल केवल 32-बिट इंच है, तो @ टॉमएमडी की चेतावनी पर ध्यान दें। ऐसा कुछ काम करना चाहिए।

import Control.Applicative 
import Control.Monad 
import Data.Binary 
import Data.Binary.Get 
import Data.Binary.Put 
import qualified Data.ByteString.Lazy as BL 
import qualified Data.ByteString as BS 
import Data.Int 
import System.Posix 

testPut = BL.writeFile "foo.bin" . runPut . mapM_ put $ nums 
    where nums :: [Int32] 
     nums = [5,6,7,8] 

testGet :: IO [Int32] 
testGet = do n <- fromInteger . toInteger . fileSize <$> getFileStatus "foo.bin" 
      let readInts = runGet (replicateM (n `div` 4) get) 
      readInts . BL.fromChunks . (:[]) <$> BS.readFile "foo.bin" 
+0

धन्यवाद एंथनी! 'BL.fromChunks का क्या मतलब है। (: []) <$>। बीएस.readFile 'यहाँ? क्यों न सिर्फ 'BL.readFile'? – masonk

+0

@ मेसनक यह शायद अनिवार्य है। मुझे यकीन नहीं है कि इस तरह से लिखने के साथ मेरा इरादा क्या था। – Anthony

4

आप इसे binary पैकेज के साथ आसानी से कर सकते हैं। आप फाइल-रीडिंग प्रलेखन here पा सकते हैं।

इसमें पहले से ही 32-बिट पूर्णांक की सूची को deserialize करने का एक तरीका शामिल है, इसलिए आपको केवल decodeFile फ़ंक्शन कॉल करने की आवश्यकता होगी। तो अगर आप एक सरणी के रूप में पूर्णांकों की अपनी सूची चाहते हैं तो उपयुक्त सरणी रूपांतरण का उपयोग, listArray रूप

decodeIntsFile :: FilePath -> IO [Int32] 
decodeIntsFile = decodeFile 

इस तरह: आप स्पष्टता के लिए इसके बारे में एक टाइप किया-संस्करण है कर सकते हैं।

+5

@oadams चेतावनी दी जानी चाहिए! '[Int32] 'के लिए' बाइनरी 'उदाहरण किसी विशेष प्रारूप की अपेक्षा करता है (यानी, फ़ाइल सूची की लंबाई को इंगित करने वाले फ़ील्ड से शुरू होती है)। यदि आपकी फ़ाइल उस प्रारूप में नहीं है (शायद यह केवल ईओएफ तक कच्चे 32 बिट मान है?) तो आप अभी भी 'बाइनरी' का उपयोग कर सकते हैं, लेकिन प्री-डिफ़ाइंड सूची उदाहरण नहीं। –

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