Float'ı bir bayt listesine dönüştürmek istiyorum [Word8] (ve tersi). Bunun için kullanılabilecek bir Storable sınıfı var, ama IO monadını kullanmaktan kaçınmak istiyorum çünkü IO ile hiçbir ilgisi yok.Float ve [Word8] arasında nasıl dönüştürebilirim?
cevap
İstediğiniz nedir? Float ile gerçek bit gösterimi arasında dönüştürme yapmak isterseniz, data-binary-ieee754 (kaputun altında Foreign.Storable
ve unsafePerformIO
kullanır) veya cereal-ieee754'u kullanabilirsiniz. İkincisi, Storable
veya IO
'u kullanmaz, değeri STUArray
'a yazar, diziyi yayınlar ve diğer türün değerini okur. Her iki paket de Float <-> Word32
(veya Double <-> Word64
) numaralı bir dönüştürmeyi sağlar, WordN
değerini [Word8]
'a dönüştürmek kolaydır.
Saklamak istemiyorsunuz İkili istediğiniz. binary package'a bakın.
Float ve Double örnekleri, "encodeFloat" ve "decodeFloat" işlevlerini kullanırlar, çünkü bunlar, bir kayan nokta değeri ve bir çift tamsayı arasında dönüştürme yapmak için uygulamadan bağımsız bir yoldur. İki tam sayı daha sonra baytlara dönüştürülür.
Data.Binary
kitaplığını öneriyorum.
Buraya bakın:
decodeFloat :: RealFloat a => a -> (Integer, Int)
:
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]
Eğer temsili, bunun nedeni Float
ve Double
için Binary
örneğinin uygulanması büyük olmasıdır neden merak ediyorsanız decodeFloat
fonksiyonunu kullanır Bu, uygulamayı Haskell Raporu olarak genel olarak tutmak için yapılır (IEEE754 veya bunun gibi bir şey belirtmez).
Float
'un gerçek ikili sunumunu elde etmek için Storable
AFAIK kullanmanız gerekir.
- 1. Haskell Nasıl Word8 Oluşturulur?
- 2. Float numarasını saat dilimine nasıl dönüştürebilirim?
- 3. Haskell Word8
- 4. MATLAB'da RGB565 ve RGB24 görüntü formatları arasında nasıl dönüştürebilirim?
- 5. Perl'deki bilimsel ve ondalık notasyon arasında nasıl dönüştürebilirim?
- 6. OCaml'de hex, oct, decimal ve binary arasında sayıları nasıl dönüştürebilirim?
- 7. ByteString ve Storable Vector arasında dönüştürme nasıl yapılır?
- 8. Float ve printf
- 9. Float
- 10. Bu LINQ sorgu ifadesini C# ile VB.NET arasında nasıl dönüştürebilirim?
- 11. 'Float -> float' türü 'float' türüyle eşleşmiyor
- 12. Javascript Float + Float = Dize?
- 13. DiffTime'ı NominalDiffTime'a nasıl dönüştürebilirim?
- 14. Float
- 15. float
- 16. HTML, taşma: kaydırma ve float
- 17. Bir ArrayList Gönderme <float[]> etkinlikler arasında (android)
- 18. ByteArrayInputStream'i jpeg'e nasıl dönüştürebilirim?
- 19. Varchar'ı datetime'ye nasıl dönüştürebilirim ve TSQ
- 20. Ruby: Bir veri dizisini karma ve json biçimine nasıl dönüştürebilirim?
- 21. HTML'yi Tekstil'e nasıl dönüştürebilirim?
- 22. Baz64 görüntüsünü nasıl dönüştürebilirim?
- 23. printf ve co, float ile double
- 24. Nokta ve dikdörtgen arasında işaretli mesafe hesapla
- 25. Kaydırmadan "float: left" nasıl yapılır?
- 26. .db'yi .xls'ye nasıl dönüştürebilirim?
- 27. Int'i CString'e nasıl dönüştürebilirim?
- 28. LF'yi CRLF'ye nasıl dönüştürebilirim?
- 29. WriteableBitmap'i BitmapImage'a nasıl dönüştürebilirim?
- 30. Nasıl Aztan Scss'e dönüştürebilirim?
cereal-ieee754 şimdi tahıl için aittir. –
Yararlı bilgi. Maalesef, dönüşüm işlevleri artık dışa aktarılmıyor. –
Şüphesiz, sonuçlanan ByteString'i işleyerek dönüşümleri kendiniz oluşturabilirsiniz. Bir performans kaybı olacak olsa da ... – ehird