haskell - 有效地将字节打包成整数?

标签 haskell

这是一开始看起来很容易的问题之一,但我已经研究了一段时间,找不到答案....

我需要将字节列表(即 Word8 s)转换为任意长度的数量(即 Integer)。例如

intPack::[Word8]->Integer
intPack [1] = 1
intPack [1, 0] = 256
showHex (intPack [1,2,3,4,5,6,7,8,9,10,11]) "" = "102030405060708090a0b"

缓慢的解决方案很容易编写(参见 How to convert a ByteString to an Int and dealing with endianness? 中的答案)
intPack = foldl (\v -> ((v*256) +)) 0

....但是我对此感到畏缩,所有额外的乘法和加法,以及在中间创建的一串无用的整数,只是为了(可能)获得与我开始打包到 Integer 类型的内部结构中的相同字节。

当然,我不知道 Integer 如何存储其数据的详细信息(也许它做的事情比将字节保存在可变长度数组中更复杂......就像使用标志来表示数字的长度,比如 utf -8 在编码字符时执行)。至少很高兴知道 intPack以上是最好的......然后我可以停止我的研究,咬(或者更确切地说是字节:))子弹,然后继续前进。

最佳答案

我会看看 binary用于有效打包和解包二进制数据结构的包:

https://hackage.haskell.org/package/binary-0.7.2.1/docs/Data-Binary-Get.html

一些想法:

  • 看看 Binary Integer实例可以为您工作:
    import Data.Binary
    import qualified Data.ByteString.Lazy.Char8 as LBS
    main = do
      let i = 0x0102030405060708090a0b0c0d0e0f :: Integer
          bs = encode i
      print ("before", i)
      LBS.writeFile "output" bs
      j <- fmap decode $ LBS.readFile "output" :: IO Integer
      print ("after", j)
    
  • 查看 word64be 等函数的定义看看它是否给你任何想法:

  • http://hackage.haskell.org/package/binary-0.7.2.1/docs/src/Data-Binary-Get.html#getWord64be

    关于haskell - 有效地将字节打包成整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25854311/

    相关文章:

    haskell - fay生成文件的大小

    haskell - Haskell 中附加词的用例

    haskell - 为什么我在这里收到 "ambiguous type variable"错误?

    haskell - 如何使用 `reify` 获取函数的声明?

    haskell - 惰性数据类型的内存使用情况

    haskell - 学习 haskell 并掌握 xmonad 配置的最佳资源

    haskell - 如何在 Options.Applicative 中为互斥标志编码

    haskell - return >=> f 在 Haskell 中如何工作?

    haskell - 如何在 Haskell 中组合单子(monad)?

    haskell - 为什么导出固定性声明为 "bad idea"?