这是一开始看起来容易的问题之一,但我已经研究了一段时间,但找不到答案....
我需要将字节列表(ie- Word8s)转换为任意长度的数字(即-a 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"
Run Code Online (Sandbox Code Playgroud)
一个缓慢的解决方案很容易编写(请参阅如何将ByteString转换为Int并处理字节序的答案 ?)
intPack = foldl (\v -> ((v*256) +)) 0
Run Code Online (Sandbox Code Playgroud)
....但是我对此畏缩,所有额外的乘法和加法,加上在中间创建的一串无用的整数,只是为了(可能)获得与打包到Integer类型的内部结构中相同的字节.
当然,我不知道Integer如何存储其数据的细节(也许它比在可变长度数组中保存字节更复杂......比如使用flags来表示数字的长度,比如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)
Run Code Online (Sandbox Code Playgroud)看一下函数的定义,word64be看看它是否能给你任何想法:
http://hackage.haskell.org/package/binary-0.7.2.1/docs/src/Data-Binary-Get.html#getWord64be