如何解决将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或类似的函数,但是大概您的字符串正在保持可以使用的长度指示器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。