Есть ли способ извлечь основной указатель на память из объекта ByteString? Мой текущий подход неверен, компилятор говорит.Как я могу получить Ptr байтовой строки?
getPtr :: ByteString -> Ptr Word8
getPtr (PS ptr _ _) = ptr
Есть ли способ извлечь основной указатель на память из объекта ByteString? Мой текущий подход неверен, компилятор говорит.Как я могу получить Ptr байтовой строки?
getPtr :: ByteString -> Ptr Word8
getPtr (PS ptr _ _) = ptr
unsafeUseAsCString
Использование из Data.ByteString.Unsafe
. Он имеет тип:
ByteString -> (CString -> IO a) -> IO a
Таким образом, вы можете использовать unsafeUseAsCString bs return
, чтобы просто получить указатель. Он не будет заканчиваться на нуль, если только ByteString
не был, и он будет иметь тип CString
(то есть Ptr CChar
) вместо Ptr Word8
, но вы можете использовать castPtr
от Foreign.Ptr
, чтобы обойти это, если это проблема.
Спасибо, я не мог себе представить, что совпадение шаблонов может вызвать нечистоту в некоторых случаях, поэтому я не просматривал функции _unsafe_. – danbst
@ danbst: Ну, на самом деле * получение * указатель чистый. Но нечетко передать указатель на функцию C, которая может мутировать ее. Если вы знаете, что такая функция чиста, для этого используется 'unsafePerformIO'. Это обещание системы типов, что вы знаете факт, хотя это невозможно доказать. –
Похоже, что ByteString.Internal не экспортирует конструктор 'PS' (с полным основанием!), Так что на самом деле вы не можете сопоставить ему шаблон. Почему именно вы хотите, чтобы указатель указывал на объект ByteString? Если мы знаем, что легче будет знать, как помочь. –
'.Internal' экспортирует' PS'. danbst: задавая вопрос, пожалуйста, укажите полный код и полное сообщение об ошибке, чтобы люди не догадывались, что происходит. – shachaf