[Haskell-beginners] doc on accessing C struct binary data

Dean Herington heringtonlacey at mindspring.com
Sat Jul 31 17:05:35 EDT 2010


At 11:40 PM -0700 7/30/10, Sean Perry wrote:
>I would like to read C structs that have been written to disk as binary
>data. Is there a reference on doing this somewhere. The IO is not too
>hard, but how do I mimic the C struct in Haskell and still honor the
>exact sizes of the various struct members?

At 9:11 AM +0100 7/31/10, Stephen Tetley wrote:
>Hi Sean
>
>Commonly people would use Data.Word and Data.Int to get sized
>integrals. There's no corresponding sized types for floats - if you're
>lucky your serialized C Structs won't use floats otherwise you'll have
>to dig out a reference manual to see how they are laid out.
>
>To actually read C-structs Data.Binary.Get should provide the
>primitives you need (getWord8, getWord16le, getWord16be, ...), you'll
>then have to assemble a parser using these primitives to read your
>struct.
>
>You might have to pay some attention to alignment - the C struct might
>be laid out with elements on byte boundaries (usually 4-byte) rather
>than directly adjacent. I suspect alignment is compiler dependent, its
>a long time since I looked at this but I believe C99 has pragmas to
>direct the compiler on alignment.
>
>Best wishes
>
>Stephen

I would recommend using hsc2hs instead, as it avoids having to 
emulate the C compiler, which is tedious and error-prone.  (See 
section 10.3 of the GHC User's Guide.)  In a nutshell, you write (the 
necessary parts of) your program in a modestly extended Haskell.  In 
an .hsc file you can #include C header files (no need to duplicate 
that code in Haskell!) and bring selected pieces of the C world 
(types, field offsets, ...) into Haskell.  The hsc2hs translator 
actually creates a C program from your .hsc file that, when executed, 
writes your .hs file, incorporating the needed knowledge from C land.

Dean


More information about the Beginners mailing list