Как преобразовать целое число в байтовую строку в 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
, которые они определяют.