Haskell Bytestring для плавающего массива

Привет, у меня есть двоичные файлы данных с плавающей запятой (32-разрядный IEEE одинарной точности), над которыми я хотел бы поработать. Как мне лучше всего загрузить это для дальнейшего использования, в идеале как (IOArray Int Float).

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

person Fabian Barkhau    schedule 03.01.2014    source источник


Ответы (4)


Если у вас есть стандартные числа с плавающей запятой одинарной точности, и вы просто хотите поработать над ними в 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
person Anthony    schedule 04.01.2014

Я думаю, вы могли бы быть счастливее с Data.Vector:

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

person misterbee    schedule 03.01.2014

Вы также можете использовать библиотеку 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
person Petr    schedule 04.01.2014

Если вы можете преобразовать 4 байта в Word32, вы можете использовать функцию wordToFloat в data-binary-ieee754, чтобы преобразовать его в число с плавающей запятой. Затем вы можете загрузить это в любую структуру, похожую на список, которую вы хотите манипулировать.

person bheklilr    schedule 03.01.2014