如何在 Haskell 中将整数转换为字节字符串

发布于 2024-08-22 02:51:29 字数 318 浏览 9 评论 0 原文

我们希望以特定的二进制格式序列化数据。我们在内部使用Data.ByteString

所以,问题是:如何将我们使用的不同数据类型转换为ByteString。对于String我们没有问题,我们可以使用encodeLazyByteString UTF8“string”。但我们还想将Integer转换为ByteString(大端)。

有谁知道如何做到这一点和/或有任何使用 Haskell 和二进制格式的好技巧吗?

谢谢!

We'd like to serialize data in a specific binary format. We use Data.ByteStrings internally.

So, the question is: How to convert the different data types we use to a ByteString. For String we have no problem, we can use encodeLazyByteString UTF8 "string". But we'd also like to convert Integers to ByteStrings (big-endian).

Does anyone know how to do that and/or has any good tips using Haskell and binary formats?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

因为看清所以看轻 2024-08-29 02:51:29

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

生成惰性字节串,当然可以将其转换为严格字节串。谷物包提供了大致相同的接口,但仅产生严格的字节串(因此没有无限的编码流)。

A perfect job for 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

to yield lazy bytestrings, which can of course be converted to strict ones. The cereal package provides much the same interface, but yields strict bytestrings only (so no infinite streaming of encodings).

红颜悴 2024-08-29 02:51:29

对于像我一样正在寻找将 Int 或 Integer 转换为 ByteString 的函数的人,可以使用: Data.ByteString.Char8.pack 。展示
如果它在你的 ghc 中编译,你可以使用 TextShow 中的 show 就更好了。我知道这并不完全是OP所要求的,但寻找前文的人可能会因其标题而对此页面感到困惑。

For those, like me, looking for a function to convert an Int or Integer to a ByteString you can use: Data.ByteString.Char8.pack . show
Even better if it compiles in your ghc you can use show from TextShow. I understand that this is not quite the OP was asking but people looking for the preceding may end up puzzled at this page due to its title.

荒路情人 2024-08-29 02:51:29

查看二进制包,或其任何非惰性变体:谷物二进制严格

在这三种情况下,由于您具有特定的二进制格式,因此我会忽略每种情况下定义的类型类 Binary,而是专注于 PutGet 他们定义的单子。

Have a look at the binary package, or any of its non-lazy variants: cereal or binary-strict .

In all three cases, since you have a specific binary format, I'd ignore the type class Binary defined in each, and instead focus on the Put and Get monads they define.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文