如何在Float和[Word8]之间进行转换?

时间:2011-12-22 08:13:06

标签: haskell

我想将Float转换为字节列表[Word8](反之亦然)。我看到有一个可以用于此的Storable类,但是我想避免使用IO monad,因为这与IO无关。

3 个答案:

答案 0 :(得分:6)

你想要的是什么?如果要在Float及其实际位表示之间进行转换,可以使用data-binary-ieee754(在引擎盖下使用Foreign.StorableunsafePerformIO)或cereal-ieee754。后者不使用StorableIO,它将值写入STUArray,强制转换数组并读取另一种类型的值。这两个软件包都会为您提供转化Float <-> Word32(或Double <-> Word64),将WordN转换为[Word8]很容易。

答案 1 :(得分:5)

我推荐Data.Binary库。

见这里:

Prelude Data.Binary> encode (13.7 :: Double)
Chunk "\SOH\SOH\NUL\NUL\NUL\NUL\NUL\NUL\NUL\affffff\ESC\255\255\255\255\255\255\255\207" Empty
Prelude Data.Binary Data.ByteString.Lazy> Data.ByteString.Lazy.unpack $ encode (13.7 :: Double)
[1,1,0,0,0,0,0,0,0,7,102,102,102,102,102,102,27,255,255,255,255,255,255,255,207]

如果您想知道为什么表示很大,那是因为Binary Float实例的实现和Double使用decodeFloat函数:

decodeFloat :: RealFloat a => a -> (Integer, Int)

这样做是为了使实现像Haskell报告一样通用(它没有指定IEEE754或类似的东西)。

要获得Float的实际二进制表示,您需要使用Storable AFAIK。

答案 2 :(得分:1)

你不想要Storable,你想要Binary。请参阅binary package

Float和Double实例使用前缀“encodeFloat”和“decodeFloat”函数,因为它们是一种在浮点值和一对整数之间进行转换的独立于实现的方法。然后将这两个整数转换为字节。