
Hello Pupeno, Tuesday, December 27, 2005, 7:10:24 AM, you wrote: P> It seems I have found a hole in Haskell... :( lazy language can't contain holes, they are just yet unevaluated thunks :) P> I basically need a set of functions to read binary data out of a Handle (a P> higher lever of hGetBuf and hPutBuf). What I am doing is implementing a DNS P> server, so, my typical need is: P> First two bytes are an integer. P> The next bit is a boolean. P> So are the following three bits. P> Then I have 4 bits which is also an integer. it's my day :) main = do h <- openBinaryFile "test" WriteMode bh <- openBitAligned h putWord16 bh (101::Int) put_ bh True putBits bh 3 (2::Int) flushBits bh hClose h h <- openBinaryFile "test" ReadMode bh <- openBitAligned h a <- getWord16 bh :: IO Int b <- get bh :: IO Boolean c <- getBits bh 3 :: IO Int print (a,b,c) hClose h http://freearc.narod.ru/Binary.tar.gz but the better way is defining instance of Binary class: data DNS = DNS Int Bool Int deriving Show instance Binary DNS where put_ bh (DNS a b c) = do putWord16 bh a put_ bh b putBits bh 3 c get bh = do a <- getWord16 bh b <- get bh c <- getBits bh 3 return (DNS a b c) main = do h <- openBinaryFile "test" WriteMode bh <- openBitAligned h put_ bh (DNS 37 True 3) flushBits bh hClose h h <- openBinaryFile "test" ReadMode bh <- openBitAligned h dns <- get bh :: IO DNS print dns hClose h you must use `openBitAligned` to open bit-aligned stream over Handle, and use `flushBits` at the end of writing. there is much more features, ask me about what you need disclaimer: the library was written in last 3 weeks, and you will be (if you want) its first user :) -- Best regards, Bulat mailto:bulatz@HotPOP.com