【发布时间】:2014-01-04 15:50:25
【问题描述】:
您好,有我想要处理的浮点数据二进制文件(单精度 32 位 IEEE)。 我怎样才能最好地加载它以供进一步使用,理想情况下是 (IOArray Int Float)。
bytesToFloats :: ByteString -> [Float]
bytesToFloatArray :: ByteString -> IOArray Int Float
【问题讨论】:
标签: haskell bytestring
您好,有我想要处理的浮点数据二进制文件(单精度 32 位 IEEE)。 我怎样才能最好地加载它以供进一步使用,理想情况下是 (IOArray Int Float)。
bytesToFloats :: ByteString -> [Float]
bytesToFloatArray :: ByteString -> IOArray Int Float
【问题讨论】:
标签: haskell bytestring
如果你有标准的单精度浮点数,而你只想在 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
【讨论】:
我认为您可能对 Data.Vector 更满意:
http://www.haskell.org/haskellwiki/Numeric_Haskell:_A_Vector_Tutorial#Parsing_Binary_Data
【讨论】:
您也可以使用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
【讨论】:
如果可以将 4 个字节转换为 Word32,则可以使用 data-binary-ieee754 包中的函数 wordToFloat 将其转换为浮点数。然后,您可以将其加载到您想要操作它的任何类型的类似列表的结构中。
【讨论】: