Как преобразовать целое число в байтовую строку в Haskell

Мы хотели бы сериализовать данные в определенном двоичном формате. Мы используем Data.ByteString внутренне.

Итак, возникает вопрос: как конвертировать разные типы данных, которые мы используем, в ByteString. Для String у нас нет проблем, мы можем использовать encodeLazyByteString UTF8 "string". Но мы также хотели бы преобразовать Integer в ByteString (big-endian).

Кто-нибудь знает, как это сделать и/или имеет хорошие советы с использованием Haskell и двоичных форматов?

Спасибо!

Ответы

Ответ 1

Идеальное задание для 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

дать ленивые байты, которые, конечно же, могут быть преобразованы в строгие. Пакет для зерновых обеспечивает тот же интерфейс, но дает только строгие байты (так что бесконечная потоковая передача кодировок).

Ответ 2

Посмотрите на двоичный пакет или любой из его нелазных вариантов: cereal или binary-strict.

Во всех трех случаях, поскольку у вас есть определенный двоичный формат, я бы проигнорировал тип класса Binary, определенный в каждом, и вместо этого сосредоточился на монадах Put и Get, которые они определяют.