Я просто пытаюсь перейти через блок SOS_MT в файле .JPEG, я не хочу использовать данные ни для чего, я просто хочу знать, где он заканчивается. Согласно тому, что я понимаю из JPEG's article in Wikipedia, в то время как все остальные блоки в файле JPEG начинаются с нескольких байтов, которые указывают длину блоков, блок SOS_MT ... ну, злое болото, которое у вас нет, но для синтаксического анализа байтов -байте, пока не дойдете до конца.Как эффективно проанализировать блок JPEG с энтропийным кодированием?
Так я пришел на следующий код, чтобы сделать только что:
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 и, насколько я имел возможность проверить его, это правильно. Это просто медленно. Любые советы о том, как улучшить, повысить производительность, этот парсер?
Данные сжатого изображения зажаты между FFDA и FFD9. Проблема в том, что FFD9 может отсутствовать, и файл все равно должен заканчиваться. Я не понимаю вашу цель в «прыжке» через блок «SOS_MT». Нет «сквозного» и ничего «с другой стороны». – BitBank
Во-первых, (потенциально) с помощью библиотеки, предназначенной для двоичной сериализации (I ' m partial to [cereal] (https://hackage.haskell.org/package/cereal)). Во-вторых, каждая ветка безоговорочно разбирает слово. Вместо синтаксического разбора этого слова и возврата, если вы потерпите неудачу позже, вы должны разобрать это слово и решите, что вы собираетесь делать дальше, основываясь на его значении. Наконец (не уверен в этом) вместо вычисления и суммирования длины используйте ['match'] (https://hackage.haskell.org/package/attoparsec -0.13.0.1/docs/Data-Attoparsec-ByteString.html), чтобы получить разборную строку, просто вычислить ее длину. – user2407038
@BitBank Простите меня, если я не понял правильно, но как насчет нескольких проходов для прогрессивного .JPEG? Не каждый проход использует другой блок SOS_MT? – dsign