[Haskell-cafe] Parsing binary data.

Matthew Sackman matthew at wellquite.org
Sun Aug 19 17:26:55 EDT 2007


Recently, Adam Langley responded so:
> On 8/18/07, Matthew Sackman <matthew at wellquite.org> wrote:
> > Also, one thing to watch out for is the fact the existing Get and Put
> > instances may not do anything like what you expect. For example, for
> > some reason I expected that the instances of Get and Put for Float and
> > Double would send across the wire Floats and Doubles in IEEE floating
> > point standard. How wrong I was...
> 
> Ah, those aren't instances of Get and Put, but of Binary[1]. You use
> the Binary instances via the functions 'get' and 'put' (case is
> important).

Gah, that'll teach me to post from memory without checking the code.
Indeed, that is what I meant, the instances of Binary.

> Get and Put provide actions like "putWord32be", for which the
> resulting bits are pretty much universally accepted. Binary has
> default instances which uses Get and Put to serialise Haskell types
> like [Int], or (Float, Float). Here the resulting bits aren't
> documented, but you can read the code and I have some C code for
> dealing with them somewhere if anyone is interrested. The
> serialisation of Float is, indeed, nothing like IEEE in either
> endianness.

Quite. Whilst we're on the subject (and I realise I might be hijacking
this thread a little), it does seem rather odd that it's very easy to
take a Word8/16/32/64 and interpret it as an integer. Similarly, it's
very easy to take an integer and convert it to a Word of some sort.

But it's vastly harder to do that for floats / non-integers. Now I know
that the number classes in the Prelude are basically broken anyway and
all really need rewriting, but it does seem completely arbitrary that
Words somehow are only allowed to contain whole numbers!

Matthew


More information about the Haskell-Cafe mailing list