簡體   English   中英

如何在Float和[Word8]之間進行轉換?

[英]How can I convert between Float and [Word8]?

我想將Float轉換為字節列表[Word8](反之亦然)。 我看到有一個Storable類可以用於此,但我想避免使用IO monad,因為這與IO無關。

你想要什么? 如果要在Float及其實際位表示之間進行轉換,可以使用data-binary-ieee754 (在引擎蓋下使用Foreign.StorableunsafePerformIO )或cereal-ieee754 后者不使用StorableIO ,它將值寫入STUArray ,轉換數組並讀取另一種類型的值。 兩個軟件包都為您提供轉換Float <-> Word32 (或Double <-> Word64 ),將WordN轉換為[Word8]很容易。

我推薦Data.Binary庫。

看這里:

Prelude Data.Binary> encode (13.7 :: Double)
Chunk "\SOH\SOH\NUL\NUL\NUL\NUL\NUL\NUL\NUL\affffff\ESC\255\255\255\255\255\255\255\207" Empty
Prelude Data.Binary Data.ByteString.Lazy> Data.ByteString.Lazy.unpack $ encode (13.7 :: Double)
[1,1,0,0,0,0,0,0,0,7,102,102,102,102,102,102,27,255,255,255,255,255,255,255,207]

如果你想知道為什么表現是那么大,這是因為執行的Binary實例FloatDouble用途decodeFloat功能:

decodeFloat :: RealFloat a => a -> (Integer, Int)

這樣做是為了使實現像Haskell報告一樣通用(它沒有指定IEEE754或類似的東西)。

要獲得Float的實際二進制表示,您需要使用Storable AFAIK。

你不想要Storable,你想要Binary。 請參閱二進制包

Float和Double實例使用前綴“encodeFloat”和“decodeFloat”函數,因為這些函數是一種在浮點值和一對整數之間進行轉換的獨立於實現的方法。 然后將兩個整數轉換為字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM