2010-02-17 24 views
13

Verileri belirli bir ikili biçimde serileştirmek istiyoruz. Data.ByteString s'yi dahili olarak kullanıyoruz.Tamsayı bir ByteString'e nasıl dönüştürülür Haskell

Yani, soru şu şekildedir: Kullandığımız farklı veri türlerini ByteString'a dönüştürme. String için sorun yok, encodeLazyByteString UTF8 "string"'u kullanabiliriz. Ancak, Integer s'yi ByteString s (büyük-endian) değerine dönüştürmeyi de istiyoruz.

Bunu yapan ve/veya Haskell ve ikili formatları kullanarak iyi ipuçları veren birileri var mı?

Teşekkürler!

cevap

12

Data.Binary için mükemmel bir iş:

Prelude> :m + Data.Binary 
Prelude Data.Binary> encode (pi :: Double) 
Chunk "\SOH\SOH\NUL\NUL\NUL\NUL\NUL\NUL\NUL\a\CAN-DT\251!\EM\255\255\255\255\255\255\255\205" Empty 

Prelude Data.Binary> encode (42 :: Integer) 
Chunk "\NUL\NUL\NUL\NUL*" Empty 

elbette sıkı olanlar dönüştürülebilir tembel bytestrings, verim. Hububat paketi, aynı arabirimi sağlar, ancak sadece kesin bytestrings verir (böylece kodlamaların sonsuz akışı olmaz).

+0

Neden bazı "\ NUL" dolguları var? Onları çıkarmak mümkün mü? – lucian

+0

"Dolgu", sabit bir bayt sayısına kodlamak için dahil edilmiştir. Kodlamayı deneyin (42 :: Int8) 've örneğin, herhangi bir dolgu görmeyeceksiniz. – Martijn

2

binary package ya da tembel olmayan varyantlarından herhangi birine bakın: cereal veya binary-strict. Her üç durumda da

, belirli bir ikili biçime sahip olduğundan, ben her tanımlanan tip sınıfı Binary görmezden ve bunun yerine kendi tanımladıkları Put ve Get monads odaklanmak istiyorum.

İlgili konular