Необходимо декодировать 16-битные байты с обратным порядком байтов без знака в целые числа в Haskell.

Есть ли простая функция, которую я могу скопировать и вставить, чтобы сделать это преобразование? Рубиновый эквивалент будет

bytes.unpack("n*")

person dan    schedule 10.07.2013    source источник
comment
Вы можете использовать optional p вместо fmap Just p <|> return Nothing.   -  person Gabriel Gonzalez    schedule 11.07.2013
comment
Спасибо. optional лучше!   -  person dan    schedule 11.07.2013


Ответы (2)


Используйте пакет 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
person Thomas M. DuBuisson    schedule 10.07.2013
comment
Как мне запустить runGet для создания списка [Integer], а не только одного проанализированного значения? - person dan; 11.07.2013
comment
Вы слышали о replicateM? - person Thomas M. DuBuisson; 11.07.2013
comment
Хорошо, стратегия replicateM работает, если вы знаете, сколько раз вы хотите выполнить итерацию, но что, если вы этого не сделаете? n <- get не возвращает этот номер. - person dan; 11.07.2013
comment
ОК, я нашел способ, используя Control.Applicative.(‹|›) Я скопировал свое решение выше. - 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) 
person dan    schedule 11.07.2013