您好,有我想要处理的浮点数据二进制文件(单精度 32 位 IEEE)。我怎样才能最好地加载它以供进一步使用,最好是(IOArray Int Float)。
bytesToFloats :: ByteString -> [Float]
bytesToFloatArray :: ByteString -> IOArray Int Float
您好,有我想要处理的浮点数据二进制文件(单精度 32 位 IEEE)。我怎样才能最好地加载它以供进一步使用,最好是(IOArray Int Float)。
bytesToFloats :: ByteString -> [Float]
bytesToFloatArray :: ByteString -> IOArray Int Float
我认为您可能对 Data.Vector 更满意:
http://www.haskell.org/haskellwiki/Numeric_Haskell:_A_Vector_Tutorial#Parsing_Binary_Data
如果您有标准的单精度浮点数,并且只想在 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
您还可以使用谷物库,例如:
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
如果可以将 4 个字节转换为 a ,则可以使用包中Word32
的函数将其转换为浮点数。然后,您可以将其加载到您想要操作它的任何类型的类似列表的结构中。wordToFloat
data-binary-ieee754