2010-02-17 14 views
13

Nous aimerions sérialiser les données dans un format binaire spécifique. Nous utilisons Data.ByteString s en interne. Donc, la question est: Comment convertir les différents types de données que nous utilisons pour ByteString. Pour String nous n'avons aucun problème, nous pouvons utiliser encodeLazyByteString UTF8 "string". Mais nous aimerions aussi convertir Integer s en ByteString s (big-endian).Comment convertir un entier en un ByteString dans Haskell

Est-ce que quelqu'un sait comment faire cela et/ou a de bons conseils en utilisant Haskell et les formats binaires?

Merci!

Répondre

12

Un travail parfait pour Data.Binary:

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 

Céder paresseux, qui chaînes ordinaires peuvent bien sûr être convertis en les strictes. Le paquet de céréales fournit à peu près la même interface, mais ne fournit que des chaînes d'octets strictes (donc pas de streaming infini d'encodages).

+0

Pourquoi un rembourrage "\ NUL" est-il prévu? Est-il possible de les enlever? – lucian

+0

"Padding" est inclus pour le coder sur un nombre fixe d'octets. Essayez 'encoder (42 :: Int8)' et vous ne verrez pas de remplissage, par exemple. – Martijn

2

Jetez un oeil à la binary package, ou l'une de ses variantes non paresseux: cereal ou binary-strict.

Dans les trois cas, puisque vous avez un format binaire spécifique, j'ignorer la classe de type Binary défini dans chaque, et se concentrer plutôt sur les Put et Get monades qu'ils définissent.