Я хочу преобразовать строгий ByteStrings
из Haskell в std::string
C ++, чтобы передать его в библиотеку C ++ через FFI . Поскольку ByteString
может содержать NULL
символов, преобразование в CString
в качестве промежуточного шага невозможно. Какой правильный подход здесь?
текущее решение
Спасибо за ответы до сих пор. Я надеялся на каноническое решение этой задачи, но, возможно, оно еще не существует:)
Некоторая документация библиотеки c ++ гласит следующее:
string (const char * s, size_t n);
Содержимое инициализируется копией строки, образованной первыми n символами в массиве символов, на которые указывает s.
Поэтому можно написать такую функцию, которая копирует один раз из ByteString для создания std :: string
foreign import ccall unsafe toCCString_ :: CString -> CUInt -> IO (Ptr CCString)
toCCString :: ByteString -> IO (Ptr CCString)
toCCString bs =
unsafeUseAsCStringLen bs $ \(cstring,len) ->
toCCString_ cstring (fromIntegral len)
Код C ++, сопровождающий toCCString_
, тогда выглядел бы так, как указали Нил и Алан.