2014-01-03 3 views
3

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

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

ответ

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 
+0

Любой, кто читает это, должен быть осторожным с контентом. –

1

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

2

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