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