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

需要在Haskell中将16位无符号大端字节解码为整数,haskell,pack,endianness,Haskell,Pack,Endianness,是否有一个简单的功能,我可以复制和粘贴,使这个转换?Ruby的等价物是 bytes.unpack("n*") 使用code或binary软件包,解码为16位无符号整数(Word16),然后将该值转换为完整的整数: import Data.Serialize ... someFunction = ... let intVal = runGet (fromIntegral `fmap` getWord16be) bytes 编辑: 与haskell中的任何monad一样,您可以使用更高级

是否有一个简单的功能,我可以复制和粘贴,使这个转换?Ruby的等价物是

bytes.unpack("n*")

使用
code
binary
软件包,解码为16位无符号整数(
Word16
),然后将该值转换为完整的
整数

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

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

导入数据。序列化
...
someFunction=。。。
让INTVAL=runGet(不要编辑:

根据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) 
eitherIntVal::B.ByteString->任一字符串[整数]
eitherIntVal=runGet(do

xs我如何运行runGet来生成一个[Integer]列表,而不仅仅是一个解析值?你听说过
replicItem
吗?好的,如果你知道要迭代多少次,replicItem策略会起作用,但如果你不知道怎么办?
n好的,我找到了一种使用Control.Applicative的方法。()我复制了上面的解决方案。您可以使用
可选p
代替
fmap只需p不返回任何内容即可。谢谢。
可选
更好!
eitherIntVal :: B.ByteString -> Either String [Integer]
eitherIntVal = runGet (do 
    xs <- replicateM 5 (Just `fmap` getWord16be <|> return Nothing)
    return $ map fromIntegral $ catMaybes xs)