gpt4 book ai didi

haskell - 使用 attoparsec 解析 JPEG 标记

转载 作者:行者123 更新时间:2023-12-04 14:42:49 25 4
gpt4 key购买 nike

作为一个项目,以加深我对 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

https://gist.github.com/767488

最佳答案

由于 parseMarker 消耗输入但可能会中途失败,因此您必须能够“倒带”并在遇到 0xFF 0x00 时重试不同的解析。

我没有安装 Attoparsec,但我认为它类似于默认情况下不回溯的 Parsec。

parseSection =
skipMany (notWord8 0xFF <|> try (word8 0xFF >> word8 0x0)) >> parseMarker

关于haskell - 使用 attoparsec 解析 JPEG 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4611680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com