Я просто пытаюсь перейти через блок SOS_MT в файле .JPEG, я не хочу использовать данные ни для чего, я просто хочу знать, где они заканчиваются. Насколько я понимаю из статьи о 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, и, насколько мне удалось убедиться, это правильно. Это просто медленно. Любые советы о том, как улучшить производительность этого парсера?
match
, чтобы получить проанализированную строку, они просто вычисляют ее длину. - person user2407038   schedule 26.02.2016