【问题标题】:Haskell Bytestring to Float ArrayHaskell 字节串转浮点数组
【发布时间】:2014-01-04 15:50:25
【问题描述】:

您好,有我想要处理的浮点数据二进制文件(单精度 32 位 IEEE)。 我怎样才能最好地加载它以供进一步使用,理想情况下是 (IOArray Int Float)。

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

【问题讨论】:

    标签: haskell bytestring


    【解决方案1】:

    如果你有标准的单精度浮点数,而你只想在 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
    

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        您也可以使用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】:

          如果可以将 4 个字节转换为 Word32,则可以使用 data-binary-ieee754 包中的函数 wordToFloat 将其转换为浮点数。然后,您可以将其加载到您想要操作它的任何类型的类似列表的结构中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-21
            • 2014-02-22
            • 1970-01-01
            • 1970-01-01
            • 2011-01-28
            • 1970-01-01
            • 2017-03-25
            • 1970-01-01
            相关资源
            最近更新 更多