4

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

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

4 回答 4

2

我认为您可能对 Data.Vector 更满意:

http://www.haskell.org/haskellwiki/Numeric_Haskell:_A_Vector_Tutorial#Parsing_Binary_Data

于 2014-01-03T21:15:26.387 回答
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
于 2014-01-04T07:28:04.330 回答
2

您还可以使用谷物库,例如:

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
于 2014-01-04T07:50:25.553 回答
1

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

于 2014-01-03T21:27:52.780 回答