.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を使用しており、検証する機会があった限り、正しいです。ただ遅いです。このパーサーをパフォーマンス面で改善するためのヒントはありますか?