将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指出的那样。     
已邀请:
文档很棒!   类型CString = Ptr CChar           C字符串是对以NUL结尾的C字符数组的引用。         类型CStringLen =(Ptr CChar,Int)           一个以字节为单位的显式长度信息的字符串,而不是终止的NUL(允许在字符串中间使用NUL字符)。    如果使用a7ѭ,应该没有问题。 (实际上,我建议这样做是因为将C ++和Haskell连接起来是一场噩梦。) 仅当您不知道其中包含的数据应该有多长时,才在ѭ9looking缓冲区中间的
NULL
字符有问题(因此必须遍历它以寻找
NULL
,希望那是数据的预期结尾) )。     
您的
ByteString
(带有空值)实际上代表一个文本字符串吗?如果不是,则
std::vector<char>
会更合适。 话虽这么说,std :: string的内部表示不依赖于null终止,所以您可以在其中包含带有null字符的std :: string。将构造函数与原型字符串(const char * s,size_t n)一起使用。只是不要依赖.c_str()与任何期望以null终止的c字符串进行接口。     
C ++字符串可以包含空字符。假设您有这样的事情:
char s1[] =\"string containing nulls\";
然后您可以将其转换为std :: string
string s2( s1, length_of_s1 );
问题是如何获得
length_of_s1
-显然您不能使用strlen或类似的函数,但是大概您的字符串正在保持可以使用的长度指示器。     

要回复问题请先登录注册