需要在Haskell中将16位无符号大端字节解码为整数
是否有一个简单的功能,我可以复制和粘贴,使这个转换?Ruby的等价物是需要在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一样,您可以使用更高级
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)