Üç 4 baytlık sihirli sayı ile başlayan bir ikili dosyayı ayrıştırmam gerektiğini varsayalım. Bunlardan ikisi sabit iplerdir. Diğer, ancak, dosyanın uzunluğu. Belirtilen uzunluk gerçek uzunluğunu uyuşmuyorsaIteratee I/O: dosya boyutunu önceden bilmem gerekiyor
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Attoparsec
import Data.Attoparsec.Enumerator
import Data.Enumerator hiding (foldl, foldl', map, head)
import Data.Enumerator.Binary hiding (map)
import qualified Data.ByteString as S
import System
main = do
f:_ <- getArgs
eitherStat <- run (enumFile f $$ iterMagics)
case eitherStat of
Left _err -> putStrLn $ "Not a beam file: " ++ f
Right _ -> return()
iterMagics :: Monad m => Iteratee S.ByteString m()
iterMagics = iterParser parseMagics
parseMagics :: Parser()
parseMagics = do
_ <- string "FOR1"
len <- big_endians 4 -- need to compare with actual file length
_ <- string "BEAM"
return()
big_endians :: Int -> Parser Int
big_endians n = do
ws <- count n anyWord8
return $ foldl1 (\a b -> a * 256 + b) $ map fromIntegral ws
, ideal olarak iterMagics
bir hata dönmelidir. Ama nasıl? Gerçek uzunluğu bir argüman olarak iletmenin tek yolu var mı? Bunu yapmak için iteratee-ish yolu bu mu? Benim için çok fazla değil :)
Başlangıçta bir yineleyici oluştururken gerçek dosya uzunluğunu argüman olarak geçiren program nedir? Belki de, dosya uzunluğunu argüman olarak almak için 'iterMagics' işlevini değiştirin. Eğer akıllı program yaparsanız, kodunuzun uzunluğu sadece bir kez geçmesi gerekir. – fuz