2013-11-24 2 views
4

Есть ли способ извлечь основной указатель на память из объекта ByteString? Мой текущий подход неверен, компилятор говорит.Как я могу получить Ptr байтовой строки?

getPtr :: ByteString -> Ptr Word8 
getPtr (PS ptr _ _) = ptr 
+2

Похоже, что ByteString.Internal не экспортирует конструктор 'PS' (с полным основанием!), Так что на самом деле вы не можете сопоставить ему шаблон. Почему именно вы хотите, чтобы указатель указывал на объект ByteString? Если мы знаем, что легче будет знать, как помочь. –

+2

'.Internal' экспортирует' PS'. danbst: задавая вопрос, пожалуйста, укажите полный код и полное сообщение об ошибке, чтобы люди не догадывались, что происходит. – shachaf

ответ

7

unsafeUseAsCString Использование из Data.ByteString.Unsafe. Он имеет тип:

ByteString -> (CString -> IO a) -> IO a 

Таким образом, вы можете использовать unsafeUseAsCString bs return, чтобы просто получить указатель. Он не будет заканчиваться на нуль, если только ByteString не был, и он будет иметь тип CString (то есть Ptr CChar) вместо Ptr Word8, но вы можете использовать castPtr от Foreign.Ptr, чтобы обойти это, если это проблема.

+0

Спасибо, я не мог себе представить, что совпадение шаблонов может вызвать нечистоту в некоторых случаях, поэтому я не просматривал функции _unsafe_. – danbst

+0

@ danbst: Ну, на самом деле * получение * указатель чистый. Но нечетко передать указатель на функцию C, которая может мутировать ее. Если вы знаете, что такая функция чиста, для этого используется 'unsafePerformIO'. Это обещание системы типов, что вы знаете факт, хотя это невозможно доказать. –

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