我正在尝试解析 Haskell 中的二进制文件格式(Apple 的二进制属性列表格式),该格式所需的内容之一是将字节序列视为(a)无符号 1-、2- 或 4-字节整数; (b) 有符号 8 字节整数; (c) 32 位float
s; (d) 64 位double
s。将字节序列转换为无符号整数很容易,甚至处理有符号整数也不容易terrible。但对于有符号整数,并且尤其 for Float
s and Double
s,我真的不想自己实现这个逻辑。我已经找到了函数int2Float# :: Int# -> Float#
and int2Double# :: Int# -> Double#
in GHC.Prim http://www.haskell.org/ghc/docs/7.0.1/html/libraries/ghc-prim-0.2.0.0/GHC-Prim.html,但这些似乎并不理想(我不是特别想使用未装箱的类型)。我希望有某种方法可以从[Word8]
or Word32
s/Word64
s。有没有类型的函数Word32 -> Float
, Word64 -> Double
, Word64 -> Int64
,或类似的?
如果你不知道,fromIntegral
完美地转换积分。另外,binary http://hackage.haskell.org/package/binary-0.5.0.2包及相关数据二进制-IEEE754 http://hackage.haskell.org/package/data-binary-ieee754包非常适用于您的问题。
λ> :set -XOverloadedStrings
λ> import Data.Binary.Get (runGet)
λ> import qualified Data.Binary.IEEE754 as I
λ> runGet I.getFloat32le "\STX\SOH\SOH\SOH"
2.369428e-38
λ> runGet I.getFloat32le "\STX\SOH\SOH\SOHtrailing characters are ignored"
2.369428e-38
λ> runGet I.getFloat32le "\STX\SOH\SOH" -- remember to use `catch`:
*** Exception: Data.Binary.Get.runGet at position 0: not enough bytes
CallStack (from HasCallStack):
error, called at libraries/binary/src/Data/Binary/Get.hs:351:5 in binary-0.8.5.1:Data.Binary.Get
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)