Как получить n-й байт из ByteString?

Как я могу получить n-й байт ByteString в Haskell?

Я пытался найти функцию типа !! для ByteStrings, но ничего не нашел.


person Malyutin Egor    schedule 22.12.2018    source источник
comment
ByteString.index вероятно, то, что вы ищете.   -  person David Maze    schedule 22.12.2018
comment
@DavidMaze, можешь просто написать ответ?   -  person Malyutin Egor    schedule 22.12.2018


Ответы (1)


ByteString.index — это функция, которую вы ищете.

Большинство «контейнерных» типов эмулируют интерфейс расширенного списка; вы также должны быть осторожны, потому что эта функция index приведет к сбою программы, если вы подадите ей слишком короткую строку (как !! в обычных списках). Лучшей реализацией может быть

import Data.ByteString as B
nthByte :: Int -> B.ByteString -> Maybe Word8
nthByte n bs = fst <$> B.uncons (B.drop n bs)

который, читая наизнанку, отбрасывает первые n байтов (возможно, создавая пустую строку байтов), затем пытается отделить первый символ от остатка и в случае успеха игнорирует остальную часть строки.

person David Maze    schedule 22.12.2018