需要在Haskell中将16位无符号大端字节解码为整数

时间:2013-07-10 19:42:38

标签: haskell pack endianness

我可以复制和粘贴一个简单的功能来进行此转换吗? Ruby等价物将是

bytes.unpack("n*")

2 个答案:

答案 0 :(得分:3)

使用cerealbinary包解码为16位无符号整数(Word16),然后将该值转换为完整Integer

import Data.Serialize
...
someFunction = ...
    let intVal = runGet (fromIntegral `fmap` getWord16be) bytes

编辑:

与haskell中的任何monad一样,您可以使用更高级别的函数(如replciateM)和上面的代码来获取int值列表(未经测试的代码如下):

import Data.Serialize
...
someFunction = ...
    let intVals = runGet (do n <- get
                             replicateM n (fromIntegral `fmap` getWord16be)) bs

答案 1 :(得分:2)

编辑:

根据Thomas M. DuBuisson的建议,这是我的解决方案:

eitherIntVal :: B.ByteString -> Either String [Integer]
eitherIntVal = runGet (do 
    xs <- replicateM 5 (Just `fmap` getWord16be <|> return Nothing)
    return $ map fromIntegral $ catMaybes xs)