1

.JPEG ファイルの SOS_MT ブロックをジャンプしようとしています。データを何にも使用したくありません。データがどこで終了するかを知りたいだけです。ウィキペディアの JPEG の記事から私が理解していることによると 、JPEG ファイル内の他のすべてのブロックはブロックの長さを示す数バイトで始まりますが、SOS_MT ブロックは ... まあ、解析するしかない邪悪な沼地です。最後に到達するまでバイトごとに。

だから私はそれを行うために次のコードを用意しました:

entropyCoded :: Parser Int
entropyCoded = do
    list_of_lengths <-  many' $
         (
           do
             _ <- notWord8 0xFF
             return 1
         )
         <|>
         (
           do
             _ <- word8 0xFF
             _ <- word8 0
             return 2
         )
         <|>
         (
           do
             l <- many1 (word8 0xFF)
             _ <- satisfy (\x -> ( x >= 0xD0 && x < 0xD7 ))
             return $ 1 + length l
         )
         <|>
         (
           do
             _ <- word8 0xFF
             maybe_ff <- peekWord8'
             if maybe_ff == 0xFF
               then
                 return 1
               else
                 fail "notthere"
         )
    foldM (\ nn n -> nn `seq` return (nn + n) ) 0 list_of_lengths

このコードはAtoparsecを使用しており、検証する機会があった限り、正しいです。ただ遅いです。このパーサーをパフォーマンス面で改善するためのヒントはありますか?

4

2 に答える 2