2010-02-17 25 views
13

Nos gustaría para serializar los datos en un formato binario específico. Usamos Data.ByteString s internamente.Cómo convertir un entero a una ByteString en Haskell

Entonces, la pregunta es: Cómo convertir los diferentes tipos de datos que usamos a un ByteString. Para String no tenemos ningún problema, podemos usar encodeLazyByteString UTF8 "string". Pero también nos gustaría convertir Integer s a ByteString s (big-endian).

¿Alguien sabe cómo hacer eso y/o tiene algunos buenos consejos usando Haskell y formatos binarios?

Gracias!

Respuesta

12

Un trabajo perfecto para 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 

para producir cadenas de bytes perezosas, que por supuesto puede transformar a las estrictas. El paquete de cereal proporciona la misma interfaz, pero cede estrictamente las cadenas de bytes (por lo que no hay transmisión infinita de codificaciones).

+0

Por qué hay algunos "\ NUL" padding por delante? ¿Es posible eliminarlos? – lucian

+0

"Padding" se incluye para codificarlo en un número fijo de bytes. Pruebe 'codificar (42 :: Int8)' y no verá relleno, por ejemplo. – Martijn

2

Eche un vistazo a binary package, o cualquiera de sus variantes no perezosas: cereal o binary-strict.

En los tres casos, ya que tiene un formato binario específico, me caso omiso de la clase de tipo Binary definido en cada uno, y en lugar de centrarse en los Put y Get mónadas que definen.