2

strictByteStringsを Haskell から C++に変換して、FFIstd::string経由で C++ ライブラリに渡したいと考えています。には文字が含まれている可能性があるため、中間ステップとしてに変換することは実行できません。ここで正しいアプローチは何ですか?ByteStringNULLCString

現在のソリューション

これまでの回答に感謝します。そのタスクの標準的な解決策を望んでいましたが、まだ存在しない可能性があります:)

一部の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)

それに付随する C++ コードはtoCCString_、Neil と Alan が指摘したように見えます。

4

3 に答える 3

3

ドキュメントは素晴らしいです!

type CString = Ptr CChar

AC 文字列は、NUL で終了する C 文字の配列への参照です。

type CStringLen = (Ptr CChar, Int)

終端の NUL の代わりにバイト単位で明示的な長さ情報を含む文字列 (文字列の途中で NUL 文字を許可)。

を使えばCStringLen問題ないはずです。(実際、C++ と Haskell のインターフェースは悪夢なので、これをお勧めします。)

NULLバッファの途中の文字は、charそこに含まれるデータの長さが不明な場合にのみ問題になります(したがって、 を探してトラバースする必要NULLがあり、それがデータの意図された終わりであることを願っています)。

于 2011-05-26T15:22:45.713 に答える
2

あなたのByteString(ヌルを含む)は実際にテキスト文字列を表していますか?そうでない場合は、std::vector<char>より適切になります。

そうは言っても、 std::string の内部表現は null 終了に依存しないため、null 文字を含む std::string を使用できます。プロトタイプ string(const char * s, size_t n) でコンストラクターを使用します。.c_str() に依存して、null で終了する c 文字列を期待するものとやり取りしないでください。

于 2011-05-26T15:25:35.407 に答える
0

C++文字列にはヌル文字を含めることができます。あなたがこのようなものを持っていると仮定します:

char s1[] ="string containing nulls";

次に、std::stringに変換できます

string s2( s1, length_of_s1 );

問題は、取得方法length_of_s1です。明らかに、strlenまたは同様の関数を使用することはできませんが、おそらく、文字列は使用できる長さインジケーターを維持しています。

于 2011-05-26T14:39:46.613 に答える