こんにちは、私が取り組みたい float データ (単精度 32 ビット IEEE) のバイナリがあります。理想的には(IOArray Int Float)として、これをさらに使用するためにどのようにロードするのが最善ですか。
bytesToFloats :: ByteString -> [Float]
bytesToFloatArray :: ByteString -> IOArray Int Float
こんにちは、私が取り組みたい float データ (単精度 32 ビット IEEE) のバイナリがあります。理想的には(IOArray Int Float)として、これをさらに使用するためにどのようにロードするのが最善ですか。
bytesToFloats :: ByteString -> [Float]
bytesToFloatArray :: ByteString -> IOArray Int Float
たとえば、穀物ライブラリを使用することもできます。
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
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
4 バイトを に変換できる場合は、パッケージ内Word32の関数を使用して float に変換できます。次に、これを操作したい任意の種類のリストのような構造にロードできます。wordToFloatdata-binary-ieee754