|
| 1 | +module Main (main) where |
| 2 | + |
| 3 | +import Control.Monad.Trans.Class (lift) |
| 4 | +import Data.Binary (get) |
| 5 | +import Data.Binary.Get (Decoder (..), runGetIncremental) |
| 6 | +import qualified Data.ByteString as B (null) |
| 7 | +import qualified Data.ByteString.Lazy as L (readFile) |
| 8 | +import qualified Data.ByteString.Lazy.Internal as L (ByteString (Chunk, Empty), chunk) |
| 9 | +import Data.Int (Int64) |
| 10 | +import Lib (TLVPacket) |
| 11 | +import ListT (ListT, cons) |
| 12 | +import qualified ListT (head) |
| 13 | +import Text.Show.Pretty (pPrint) |
| 14 | + |
| 15 | +parseTLVPackets :: MonadFail m => Decoder TLVPacket -> (Int64, L.ByteString) -> ListT m TLVPacket |
| 16 | +parseTLVPackets (Fail _ loc e) (br, _) = lift $ fail $ "error parse at " ++ show (br + loc) ++ ": " ++ e |
| 17 | +parseTLVPackets (Done r _ p) (_, L.Empty) | B.null r = return p |
| 18 | +parseTLVPackets (Done r o p) (br, input) = cons p $ parseTLVPackets (runGetIncremental get) (o + br, L.chunk r input) |
| 19 | +parseTLVPackets (Partial k) (br, L.Empty) = parseTLVPackets (k Nothing) (br, L.Empty) |
| 20 | +parseTLVPackets (Partial k) (br, L.Chunk bs input) = parseTLVPackets (k (Just bs)) (br, input) |
| 21 | + |
| 22 | +main :: IO () |
| 23 | +main = do |
| 24 | + file <- L.readFile "F:\\29999.mmts" |
| 25 | + let packets = parseTLVPackets (runGetIncremental get) (0, file) |
| 26 | + len <- ListT.head packets |
| 27 | + pPrint len |
| 28 | + |
| 29 | +-- list <- toList $ parseTLVPackets (runGetIncremental get) file |
| 30 | +-- print list |
| 31 | + |
| 32 | +-- mapM_ print $ runGet (parseLimitPacket 2) input |
0 commit comments