我只是想跳过 .JPEG 文件中的 SOS_MT 块,我不想将数据用于任何事情,我只想知道它在哪里结束。根据我从 Wikipedia 中 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,据我有机会验证它是正确的。只是很慢。关于如何在性能方面改进此解析器的任何提示?