Как преобразовать Integer в ByteString в Haskell

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

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

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

Спасибо!


person Johannes Weiss    schedule 17.02.2010    source источник


Ответы (3)


Идеальная работа для 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

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

person Don Stewart    schedule 17.02.2010
comment
Почему есть некоторые дополнения \NUL вперед? Можно ли их удалить? - person lucian; 04.06.2016
comment
Заполнение включено для кодирования его в фиксированное количество байтов. Попробуйте encode (42 :: Int8), и вы, например, не увидите отступов. - person Martijn; 01.11.2017

Для тех, кто, как и я, ищет функцию для преобразования Int или Integer в ByteString, вы можете использовать: Data.ByteString.Char8.pack . show Еще лучше, если он компилируется в вашем ghc, вы можете использовать show из TextShow. Я понимаю, что это не совсем то, о чем спрашивал ОП, но люди, которые ищут предыдущее, могут оказаться озадаченными на этой странице из-за ее названия.

person George Co    schedule 16.02.2019
comment
Но если у вас их много, я думаю, что такие вещи, как word16Dec :: Word16 -> Builder, будут работать лучше. Поскольку вы можете объединить эти строители быстрее, чем вы можете объединить байтовые строки. - person Janus Troelsen; 02.04.2021

Взгляните на двоичный пакет или любой из его неленивых вариантов. : зерновые или бинарный-строгий .

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

person MtnViewMark    schedule 17.02.2010