[Haskell-beginners] binary parsing problem
Alexander Polakov
plhk at sdf.org
Sun Mar 24 02:07:32 CET 2013
I'm trying to parse a binary format.
One of the components is defined like this:
"BITDOUBLE:
1st 2 bits : what it is
00 : A double follows
01 : 1.0
10 : 0.0
11 : not used
Doubles are eight byte IEEE standard floating point values."
So I wrote this code which looks almost like verbatim translation
of the spec.
import Data.Binary
import Data.Binary.Get
import Control.Applicative
import qualified Data.Binary.Bits.Get as Bits
newtype DWG_BD = DWG_BD Double deriving (Show)
instance Binary DWG_BD where
put = undefined
get = do
d <- Bits.runBitGet $ Bits.getWord8 2 >>= \i ->
case i of
0 -> decode <$> Bits.getLazyByteString 8
1 -> return 1.0
2 -> return 0.0
_ -> fail "bad DWG_BD"
return (DWG_BD d)
But then when I try to parse anything starting with 00 bits, I get this:
*Main> decodeFile "/tmp/foo" :: IO DWG_BD
DWG_BD *** Exception: Data.Binary.Get.runGet at position 2: demandInput:
not enough bytes
I'm 100% sure there're enough bytes in the file. I recall seeing this
problem when my record's fields were not strict, but this is not the
case here. I suppose the problem lies in getLazyByteString, but have
no idea how to solve it.
--
Alexander Polakov | plhk.ru
More information about the Beginners
mailing list