Haskell Bytestring到Float数组

时间:2014-01-03 20:58:27

标签: haskell bytestring

您有我想要处理的浮点数据(单精度32位IEEE)的二进制文件。 我怎样才能最好地加载它以供进一步使用,最好是(IOArray Int Float)。

bytesToFloats :: ByteString -> [Float]
bytesToFloatArray :: ByteString -> IOArray Int Float

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

如果你有标准的单精度浮标,并且你只想在Haskell中使用它们,那么你可能总是对它不知所措:

import Data.ByteString.Internal as BS
import qualified Data.Vector.Storable as V

bytesToFloats :: BS.ByteString -> V.Vector Float
bytesToFloats = V.unsafeCast . aux . BS.toForeignPtr
  where aux (fp,offset,len) = V.unsafeFromForeignPtr fp offset len

答案 2 :(得分:2)

您也可以使用cereal库,例如:

import Control.Applicative
import Data.ByteString
import Data.Serialize

floatsToBytes :: [Float] -> ByteString
floatsToBytes = runPut . mapM_ putFloat32le

-- | Parses the input and returns either the result or an error description.
bytesToFloat :: ByteString -> Either String [Float]
bytesToFloat = runGet $ many getFloat32le

答案 3 :(得分:1)

如果您可以将4个字节转换为Word32,则可以使用data-binary-ieee754包中的函数wordToFloat将其转换为浮点数。然后,您可以将其加载到您想要操作它的任何类型的列表结构中。