将Haskell ByteStrings转换为C ++ std :: string
||
我想将严格的“ 0”从Haskell转换为C ++的“ 1”,以通过FFI将其传递到C ++库。由于
ByteString
可能包含NULL
个字符,因此转换为CString
作为中间步骤是不可行的。这里正确的方法是什么?
当前解决方案
到目前为止,感谢您的回答。我希望为该任务提供规范的解决方案,但也许尚不存在:)
一些c ++库文档说:
字符串(const char * s,size_t n);
内容被初始化为由s指向的字符数组中前n个字符组成的字符串的副本。
因此,可以编写这样的函数,该函数从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)
伴随着toCCString_
的C ++代码看起来就像Neil和Alan指出的那样。
没有找到相关结果
已邀请:
3 个回复
窃誓额
字符有问题(因此必须遍历它以寻找
,希望那是数据的预期结尾) )。
际恃啸称桅
(带有空值)实际上代表一个文本字符串吗?如果不是,则
会更合适。 话虽这么说,std :: string的内部表示不依赖于null终止,所以您可以在其中包含带有null字符的std :: string。将构造函数与原型字符串(const char * s,size_t n)一起使用。只是不要依赖.c_str()与任何期望以null终止的c字符串进行接口。
款去芳尾脊
然后您可以将其转换为std :: string
问题是如何获得
-显然您不能使用strlen或类似的函数,但是大概您的字符串正在保持可以使用的长度指示器。