[Haskell-cafe] Detecting system endianness

Holger Siegel holgersiegel74 at yahoo.de
Thu Dec 18 08:03:40 EST 2008


On Thursday 18 December 2008 13:40:47 Ryan Ingram wrote:
> Actually, this is probably safer:
>
> import Foreign.Marshal.Alloc
> import Foreign.Ptr
> import Foreign.Storable
> import Data.Word
> import System.IO.Unsafe
>
> endianCheck = unsafePerformIO $ alloca $ \p -> poke p (0x01020304 ::
> Word32) >> peek (castPtr p :: Ptr Word8)
>
> littleEndian = endianCheck == 4
> bigEndian = endianCheck == 1
>
>   -- ryan
>
> On Thu, Dec 18, 2008 at 4:33 AM, Ryan Ingram <ryani.spam at gmail.com> wrote:
> > I think something like this might work:
> >
> > Prelude GHC.Exts GHC.Word> let W64# x = 0x100000002 in W32#
> > (unsafeCoerce# x) 2
> >
> > You should get 1 for big-endian and 2 for little-endian.
> >
> > (Disclaimer: not particularily well-tested.)


Using modules Data.Binary, Data.Binary.Put and Data.Word, you can define

  littleEndian =  (decode $ runPut $ putWord16host 42 :: Word8) == 42

Under the hood, it also uses peek and poke, but it looks a bit more 
functional.




More information about the Haskell-Cafe mailing list