У меня есть вызов FFI, возвращающий некоторые байты данных (а не CString
). В настоящее время я использую что-то вроде следующего:Ptr Word8 to ByteString
import qualified Data.ByteString as BS
BS.pack <$> mapM (peekElem ptr) [0 .. n - 1]
Есть ли более эффективный подход к этому? Похоже, что googling направлен на использование Data.ByteString.Internal
, но, похоже, он недоволен (привязка к внутренним интерфейсам). Фактически they don't seem больше предлагает документы для внутреннего модуля. Есть ли более эффективный переносной подход? Я постоянно сталкиваюсь с этой проблемой при работе с байтами от FFI. Я просто хочу:
ptrToBs :: Ptr Word8 -> Int -> IO ByteString
ptrToBs buf n = ... -- totally fine if it makes a copy of the buffer
(я проверить Hoogle первым.)
Может быть, я использую неправильный тип для «сырых байтов, которые будут потребляемый Binary.Get
или какой-либо другой декодирования пакета позже»?
Я думаю, это именно то, что я хочу. Можете ли вы добавить это как ответ? Байты - байты. (Я думал о том, что строки являются нулевыми, но packCStringLen позволяет мне отключиться. – Tim