【问题标题】:How to convert a Integer to a ByteString in Haskell如何在 Haskell 中将 Integer 转换为 ByteString
【发布时间】:2010-02-17 17:56:05
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: haskell bytestring


    【解决方案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
    

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

    【讨论】:

    • 为什么前面有一些“\NUL”填充?是否可以删除它们?
    • “填充”被包括在内以将其编码为固定数量的字节。试试encode (42 :: Int8),例如,你会看到没有填充。
    【解决方案2】:

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

    【讨论】:

    • 但如果你有很多,我认为像word16Dec :: Word16 -> Builder 这样的东西会表现得更好。因为您可以比连接字节串更快地连接这些构建器。
    【解决方案3】:

    查看binary package,或其任何非惰性变体:cerealbinary-strict

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 2021-02-21
      • 1970-01-01
      • 2022-11-16
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多