2016-03-15 3 views
3

У меня есть вызов 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 или какой-либо другой декодирования пакета позже»?

+1

Я думаю, это именно то, что я хочу. Можете ли вы добавить это как ответ? Байты - байты. (Я думал о том, что строки являются нулевыми, но packCStringLen позволяет мне отключиться. – Tim

ответ

7

Кажется, вы хотите избежать CString для (по моему мнению отличной) причины, что они завершены нулем. Более принципиальный CStringLen не имеет этой слабости, поэтому packCStringLen :: CStringLen -> IO ByteString должен быть подходящим для вашей задачи.

Смежные вопросы