On 2001-07-24T16:51:54-0700, [EMAIL PROTECTED] wrote:
> Hello,
> 
> Is it possible in Haskell to access the underlying machine bit
> representation of a Float or Double value?
> 
> I need to be able to be able to send this bit representation as a
> list of bytes in network byte order to a process running on a
> different platform (with a different host byte order to my
> platform).
> 
> For reference, I run Haskell under Linux on Intel. The processes I
> want to communicate with run under Sun Solaris, Hitachi HPUX and
> Java everywhere.
> 
> Any suggestions, for any Haskell translator much appreciated.

If you're using GHC, you should be able to get at the raw bits of the
machine representation using some Storable + Ptr + MarshallAlloc
trickery.  (These are modules in -package lang.)

I tested the following on GHC5 on i386-linux:

    module Cast (cast) where

    import Storable (Storable, sizeOf, peek)
    import MarshalUtils (withObject)
    import IOExts (unsafePerformIO)
    import Ptr (castPtr)

    cast :: (Storable a, Storable b) => a -> b
    cast a = b where
      b | sizeOf a == sizeOf b =
        unsafePerformIO $ withObject a $ peek . castPtr

I was able to get

    (cast :: Int -> Char) 98 == 'b'

This might work with other compilers as well, but I don't know...

Fun fun fun!  More efficient implementations?

-- 
Edit this signature at http://www.digitas.harvard.edu/cgi-bin/ken/sig
« ne gâche pas ta vie pour leur idée de patrie » le bouton me dit

PGP signature

Reply via email to