您有我想要处理的浮点数据(单精度32位IEEE)的二进制文件。 我怎样才能最好地加载它以供进一步使用,最好是(IOArray Int Float)。
bytesToFloats :: ByteString -> [Float]
bytesToFloatArray :: ByteString -> IOArray Int Float
答案 0 :(得分:2)
我认为你可能对Data.Vector更开心:
http://www.haskell.org/haskellwiki/Numeric_Haskell:_A_Vector_Tutorial#Parsing_Binary_Data
答案 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
将其转换为浮点数。然后,您可以将其加载到您想要操作它的任何类型的列表结构中。