Исправление ошибок
Кажется, здесь может быть ошибка. Исключение возникает, если вы достигаете конца потока байтов до 0xff, а не 0x00 последовательности. Вот модифицированная версия вашей функции:
parseECS :: Get L.ByteString
parseECS = f [] False
where
f acc ff = do
noMore <- isEmpty
if noMore
then return $ L.pack (reverse acc)
else do
b <- getWord8
if ff
then
if b == 0x00
then f (0xff:acc) False
else return $ L.pack (reverse acc)
else
if b == 0xff
then f acc True
else f (b:acc) False
Оптимизация
Я не выполнял профилирование, но эта функция, вероятно, будет быстрее. Реверсирование длинных списков стоит дорого. Я не уверен, насколько ленива getRemainingLazyByteString
. Если он слишком строг, это, вероятно, не сработает для вас.
parseECS2 :: Get L.ByteString
parseECS2 = do
wx <- liftM L.unpack $ getRemainingLazyByteString
return . L.pack . go $ wx
where
go [] = []
go (0xff:0x00:wx) = 0xff : go wx
go (0xff:_) = []
go (w:wx) = w : go wx