gpt4 book ai didi

c++ - 将 Haskell ByteString 转换为 C++ std::string

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:46 25 4
gpt4 key购买 nike

我想将 Haskell 的严格 ByteStrings 转换为 C++ 的 std::string 以通过 the FFI 将其传递给 C++ 库.由于 ByteString 可能包含 NULL 字符,因此作为中间步骤转换为 CString 是不可行的。什么是正确的方法?

当前解决方案

感谢您到目前为止的回答。我希望为该任务找到一个规范的解决方案,但也许它还不存在 :)

一些 c++ library documentation说如下:

string ( const char * s, size_t n );

Content is initialized to a copy of the string formed by the first n characters in the array of characters pointed by 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)

toCCString_ 附带的 C++ 代码看起来就像 Neil 和 Alan 指出的那样。

最佳答案

documentation太棒了!

type CString = Ptr CChar

A C string is a reference to an array of C characters terminated by NUL.

类型 CStringLen = (Ptr CChar, Int)

A string with explicit length information in bytes instead of a terminating NUL (allowing NUL characters in the middle of the string).

如果您使用CStringLen,您应该没有问题。 (事实上​​,我推荐这个是因为 interfacing C++ and Haskell is a nightmare 。)

char 缓冲区中间的

NULL 字符仅在您不知道其中包含的数据应该多长时间时才有问题(因此必须遍历它以寻找 NULL,希望那是数据的预期结尾)。

关于c++ - 将 Haskell ByteString 转换为 C++ std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com