2016-02-26 6 views
1

Я просто пытаюсь перейти через блок 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 и, насколько я имел возможность проверить его, это правильно. Это просто медленно. Любые советы о том, как улучшить, повысить производительность, этот парсер?

+0

Данные сжатого изображения зажаты между FFDA и FFD9. Проблема в том, что FFD9 может отсутствовать, и файл все равно должен заканчиваться. Я не понимаю вашу цель в «прыжке» через блок «SOS_MT». Нет «сквозного» и ничего «с другой стороны». – BitBank

+0

Во-первых, (потенциально) с помощью библиотеки, предназначенной для двоичной сериализации (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

+0

@BitBank Простите меня, если я не понял правильно, но как насчет нескольких проходов для прогрессивного .JPEG? Не каждый проход использует другой блок SOS_MT? – dsign

ответ

2

Если вы хотите пропустить рынок SOS, просто найдите следующий маркер, который не является маркером перезапуска.

Прочитать байты до тех пор, пока вы не найдете и FF. Если следующее значение 00, это сжатое значение FF и пропустить его. Если это маркер перезапуска, пропустите его. В противном случае FF должен запустить следующий блок.

 Смежные вопросы

  • Нет связанных вопросов^_^