Data.Bits
обеспечивает побитовые операции: https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Bits.html
вы можете сначала разбить строку байтов на 2 строки байтов с помощью splitAt
и словом 8, а затем прочитать слово 8 по битам с помощью testBit
и shiftL
/ shiftR
type Frag = ([Bool], ByteString, [Bool]) -- naive representation of a list of bits
splitBS :: Int -> ByteString -> (Frag, Frag)
splitBS bits bs =
let (byte, remb) = bits `quotRem` 8
(bs1, t) = splitAt byte bs
w = head t
bs2 = tail t
(b1, b2) = splitWord remb w
in (([], bs1, b1), (b2, bs2, []))
fromBits :: Bits a => a -> [Bool]
fromBits b
| b == zeroBits = []
| otherwise = testBit b 0 : fromBits (shiftR b 1)
fromBits' :: Bits a => a -> [Bool]
fromBits' = reverse . fromBits
splitWord :: Int -> Word -> ([Bool], [Bool])
splitWord n w =
let bl = fromBits' w
in (take n bl, drop n bl)