我们希望以特定的二进制格式序列化数据。我们在内部使用Data.ByteString
。
所以,问题是:如何将我们使用的不同数据类型转换为ByteString
。对于String
我们没有问题,我们可以使用encodeLazyByteString UTF8 "string"
。但我们也希望将Integer
转换为ByteString
s(big-endian)。
有没有人知道怎么做和/或有任何使用Haskell和二进制格式的好技巧?
谢谢!
答案 0 :(得分:17)
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
产生惰性字节串,当然可以转换为严格的字节串。谷物包提供了相同的接口,但只产生严格的字节串(因此没有无限的编码流)。
答案 1 :(得分:3)
查看binary package或其任何非惰性变种:cereal或binary-strict。
在所有三种情况下,由于您有特定的二进制格式,我会忽略每个格式中定义的类型类Binary
,而是专注于Put
和Get
monad定义
答案 2 :(得分:1)
对于像我一样的人,寻找将Int或Integer转换为ByteString的函数,可以使用:Data.ByteString.Char8.pack。节目 如果它可以在您的ghc中编译,则更好,您可以使用TextShow中的show。我了解这并不是OP所要求的,但是由于标题的原因,寻找前一个的人可能会对此页面感到困惑。