[Haskell-cafe] Endian conversion

Joel Reymont joelr1 at gmail.com
Thu Oct 6 04:04:26 EDT 2005


Regarding NewBinary... I think my challenge is how to add endian- 
conversion without duplicating all the put and get methods from  
NewBinary.

I would still use that bit of TH code to figure out whether my  
platform is big or little endian. I don't care about cross- 
compilation and what that code does is analogous to #ifdef ...  
#define LITTLE_ENDIAN ... #endif, etc.

I'm looking for architectural suggestions, though. Should I define  
LittleEndian Word32, BigEndian Word16, etc. or should I have Endian  
Word32 Big, Endian Word16 Little, etc.

     Thanks, Joel

On Oct 5, 2005, at 11:42 AM, Udo Stenzel wrote:

>>> Why don't you pull out 4 bytes and assemble them manually?
>>>
>
> To that I'd like to add a snippet from NewBinary itself:
>
> | instance Binary Word32 where
> |   put_ h w = do
> |     putByte h (fromIntegral (w `shiftR` 24))
> |     putByte h (fromIntegral ((w `shiftR` 16) .&. 0xff))
> |     putByte h (fromIntegral ((w `shiftR` 8)  .&. 0xff))
> |     putByte h (fromIntegral (w .&. 0xff))
> |   get h = do
> |     w1 <- getWord8 h
> |     w2 <- getWord8 h
> |     w3 <- getWord8 h
> |     w4 <- getWord8 h
> |     return $! ((fromIntegral w1 `shiftL` 24) .|.
> |            (fromIntegral w2 `shiftL` 16) .|.
> |            (fromIntegral w3 `shiftL`  8) .|.
> |            (fromIntegral w4))
>
> This obviously writes a Word32 in big endian format, also known as
> "network byte order", and doesn't care how the host platform stores
> integers.  No need for `hton' and `ntoh'.  To convert it to write  
> little
> endian, just copy it and reorder some lines.  (But I think, writing LE
> integers with no good reason and without an enclosing protocol that
> explicitly declares them (like IIOP) is a bad idea.)

--
http://wagerlabs.com/idealab







More information about the Haskell-Cafe mailing list