binary-strict-0.4.8: Binary deserialisation using strict ByteStrings

MaintainerAdam Langley <>




This is a reader monad for parsing bit-aligned data. The usual Get monad handles byte aligned data well.

In this monad, the current offset into the input is a number of bits, and fetching n bits from the current position will shift everything correctly. Bit vectors are represented as ByteStrings here either the first n bits are valid (left aligned) or the last n bits are (right aligned).

If one is looking to parse integers etc, right alignment is the easist to work with, however left alignment makes more sense in some situations.


Get BitGet type

data BitGet a Source


runBitGet :: ByteString -> BitGet a -> Either String aSource

Run a BitGet on a ByteString


skip :: Int -> BitGet ()Source

Skip n bits of the input. Fails if less then n bits remain

remaining :: BitGet IntSource

Return the number of bits remaining to be parsed

isEmpty :: BitGet BoolSource

Return true if there are no more bits to parse

lookAhead :: BitGet a -> BitGet aSource

Run ga, but return without consuming its input. Fails if ga fails.

Generic parsing

getBit :: BitGet BoolSource

Get a single bit from the input

getLeftByteString :: Int -> BitGet ByteStringSource

Get a ByteString with the given number of bits, left aligned.

getRightByteString :: Int -> BitGet ByteStringSource

Get a ByteString with the given number of bits in, right aligned.

Interpreting some number of bits as an integer

getAsWord16 :: Int -> BitGet Word16Source

Read a Word16 in big endian format

getAsWord32 :: Int -> BitGet Word32Source

Read a Word32 in big endian format

getAsWord64 :: Int -> BitGet Word64Source

Read a Word64 in big endian format

Parsing particular types