4

こんにちは、私が取り組みたい float データ (単精度 32 ビット IEEE) のバイナリがあります。理想的には(IOArray Int Float)として、これをさらに使用するためにどのようにロードするのが最善ですか。

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

4 に答える 4

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 に答える
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 に答える
1

4 バイトを に変換できる場合は、パッケージ内Word32の関数を使用して float に変換できます。次に、これを操作したい任意の種類のリストのような構造にロードできます。wordToFloatdata-binary-ieee754

于 2014-01-03T21:27:52.780 に答える