[Haskell-cafe] Data.Binary and little endian encoding

Don Stewart dons at galois.com
Sun May 17 09:08:29 EDT 2009


Sven.Panne:
> Am Freitag, 15. Mai 2009 06:37:22 schrieb Don Stewart:
> > timd:
> > > On a related matter, I am using Data.Binary to serialise data from
> > > haskell for use from other languages. [...]
> > [...]
> > Yep, it's possible, just not portably so. Google for Data.Binary IEEE
> > discussions.
> 
> I think this topic pops up over and over again, and the proposed "solutions" 
> are no solutions at all, neither from a performance point of view, nor from an 
> ease of use point of view. Proposing insane bit fiddling by hand when all one 
> technically needs is often a "peek" or "poke" amounts to simply ignoring an 
> API problem. ;-)
> 
> I think most problems can be fixed in a rather pragmatic way by adding a few 
> functions to the binary package:
> 
> Add to Data.Binary.Builder:
> 
>    putFloatIEEEbe :: Float -> Builder
>    putDoubleIEEEbe :: Double -> Builder
>    putFloatIEEEle :: Float -> Builder
>    putDoubleIEEEle :: Double -> Builder
>    putFloatIEEEhost :: Float -> Builder
>    putDoubleIEEEhost :: Double -> Builder
> 
> Add to Data.Binary.Get:
> 
>    getFloatIEEEbe :: Get Float
>    getDoubleIEEEbe :: Get Double
>    getFloatIEEEle :: Get Float
>    getDoubleIEEEle :: Get Double
>    getFloatIEEEhost :: Get Float
>    getDoubleIEEEhost :: Get Double
> 
> Add to Data.Binary.Put:
> 
>    putFloatIEEEbe ::  Float -> Put
>    putDoubleIEEEbe ::  Double -> Put
>    putFloatIEEEle ::  Float -> Put
>    putDoubleIEEEle ::  Double -> Put
>    putFloatIEEEhost ::  Float -> Put
>    putDoubleIEEEhost ::  Double -> Put
> 
> The *host functions are basically peek/poke for most platforms. The *le/*be 
> functions can use peek/poke if the endianess matches (compile time decision) 
> *and* the alignment is OK for the given platform (runtime decision). Non-IEEE 
> platforms always have to do the bit fiddling internally, but all this is 
> hidden behind the above API.
> 
> IIRC I have proposed something similar 1-2 years ago, but I can't remember any 
> reason why this hasn't been implemented. Any comments on the above functions?


Patches are welcome.
  
> One final remarks: I think the low level functions of the binary package 
> should really keep the notions of "endianess" and "alignment constraints" 
> separate, something which isn't done currently: The *host functions have 
> alignment restrictions, the *be/*le functions don't. There is no good reason 
> for this non-orthogonality.

That seems reasonable.

-- Don


More information about the Haskell-Cafe mailing list