Есть ли простая функция, которую я могу скопировать и вставить, чтобы сделать это преобразование? Рубиновый эквивалент будет
bytes.unpack("n*")
Есть ли простая функция, которую я могу скопировать и вставить, чтобы сделать это преобразование? Рубиновый эквивалент будет
bytes.unpack("n*")
Используйте пакет cereal
или binary
, декодируйте в 16-битное целое число без знака (Word16
), затем преобразуйте это значение в полное Integer
:
import Data.Serialize
...
someFunction = ...
let intVal = runGet (fromIntegral `fmap` getWord16be) bytes
Редактировать:
Как и в случае с любой монадой в Haskell, вы можете использовать функцию более высокого уровня, такую как replciateM
, вместе с приведенным выше кодом, чтобы получить список значений int (следует непроверенный код):
import Data.Serialize
...
someFunction = ...
let intVals = runGet (do n <- get
replicateM n (fromIntegral `fmap` getWord16be)) bs
replicateM
?
- person Thomas M. DuBuisson; 11.07.2013
n <- get
не возвращает этот номер.
- person dan; 11.07.2013
РЕДАКТИРОВАТЬ:
Основываясь на предложениях Томаса М. ДюБюиссона, вот мое решение:
eitherIntVal :: B.ByteString -> Either String [Integer]
eitherIntVal = runGet (do
xs <- replicateM 5 (Just `fmap` getWord16be <|> return Nothing)
return $ map fromIntegral $ catMaybes xs)
optional p
вместоfmap Just p <|> return Nothing
. - person Gabriel Gonzalez   schedule 11.07.2013optional
лучше! - person dan   schedule 11.07.2013