【发布时间】:2011-01-06 04:14:06
【问题描述】:
作为一个加深我对 Haskell 的了解和熟悉的项目,我正在努力实现一个 JPEG 解码器,它将在未来的计算机视觉工作中派上用场。
我选择的第一步是解析图像中的所有“标记”。这些由字节 0xFF 后跟非 0 字节指示。 0xFF 字节后跟 0x00 字节应视为普通数据。
我遇到的问题是,在遇到 0xFF 0x00 组合时,解析似乎完全完成并且没有找到更多有效标记(如果您在标准 JPEG 上运行,您将看到图像标记的开始解析,但不是0xFF 0x00 通常出现在图像数据本身内)。
import System.Environment
import System.IO
import Control.Applicative hiding (many)
import Data.Attoparsec as A
import qualified Data.ByteString as BS
parseMarker = do
part1 <- word8 0xFF
part2 <- notWord8 0x0
return (part1, part2)
parseSection = do
A.skipWhile (\x -> x /= 0xFF) *> parseMarker
parseBody = do
many parseSection
parseJPEG jpeg = do
handleParseResult $ feed (parse parseBody jpeg) BS.empty
handleParseResult result = do
case result of
Fail _ _ msg -> msg
Done _ r -> show r
_ -> ""
main = do
(filename : _ ) <- getArgs
handle <- openFile filename ReadMode
contents <- BS.hGetContents handle
putStrLn $ parseJPEG contents
hClose handle
【问题讨论】:
-
IMO,你应该在这里发布你的代码。它没有那么长,而且更容易回复。
-
好点,下次我一定会这样做的。
标签: haskell attoparsec