これは、何よりもタイプの複雑さを理解していないことのほうが多いと思います。これを解決しようとすると、私は数回近くにいるように感じますが、まだそこにはいません。
Data.Binaryを使用してストリームから読み取ろうとしています。次のセクションに1つ以上のチャンクを含めることができるようになりましたが、ストリームの解析を開始するまで情報はわかりません。これらの複数のチャンクを返す際に問題が発生します。
これがコードです、そして私がこれについて間違った方法で行っているならば、私に知らせてください。ただし、ストリームに書き戻すには、同じスキャフォールディングを簡単に使用できる必要があることに注意してください。
おそらく役立つ情報:
- ストリームはPEファイルです
- レンズ(fclabels)を使用しています
- DataDirectoryタイプは、他のタイプの数レベル深くネストされています。
data DataDirectory = DataDirectory { _dataEntryList :: [DataEntry] } deriving (Show, Eq, Ord) data DataEntry = DataEntry { _virtAddr :: Word32 -- VirtualAddress ^ relative virtual address of the table , _size :: Word32 -- Size ^ size of the table in bytes } deriving (Show, Eq, Ord) parseDataDir :: Word32 -> Get DataDirectory parseDataDir n = do -- PE Files have a maximum of 16 sections in the DataDir -- most windows tools just set this to 16 by default -- instead of hard-coding 16 sections we will verify let nDirs = fromIntegral (min mAX_NUMBEROF_DIRECTORY_ENTRIES n) :: Int dd_dentries <- parseDataEntry nDirs return $ DataDirectory dd_dentries parseDataEntry :: Int -> [Get DataEntry] -- Not exactly sure on return type here parseDataEntry n = Prelude.replicate n $ getWord32le >>= \vAddr -> getWord32le >>= \ddSize -> return $ DataEntry vAddr ddSize
私はこれまで、ストリーム全体を取得し、 nDirsに8バイトを掛けて長さを取得し、解析することを避けてきました。これは確かにこのインスタンスでは機能しますが、他の場所ではダウンレンジしない可能性があります。