这是一开始看起来很容易的问题之一,但我已经研究了一段时间,找不到答案....
我需要将字节列表(即 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/