プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

C++/CLIでString型の文字列をchar型に変換する。

f:id:paveway:20190914064630j:plain

はじめに

アンマネージコードと混在したプロジェクトで、String型の文字列をchar型に変換する必要がありました。
Stringクラスに変換用のメソッドがないか探しましたが見当たらないため、変換方法を調査しました。

変換方法

String型の文字列をchar型に変換するには、Marshal.StringToHGlobalAnsiメソッドを利用します。
Marshal.StringToHGlobalAnsiメソッドにより、String型の文字列がアンマネージのchar型のメモリに変換されます。
そのため使用後はMarshal.FreeHGlobalメソッドでアンマネージのchar型のメモリを解放する必要があります。

///
/// String型の文字列をchar型の文字列に変換します。
/// @param src 変換元のString型の文字列
/// @param dst 変換後のchar型文字列を格納するバッファ
/// @param dstLen 返還後のchar型文字列を格納するバッファ長
/// @param encoding 文字エンコーディング
///
void String2Char(String^ src, char* dst, int dstLen, String^ encoding)
{
    // String型の文字列をchar型の文字列に変換します。
    const char* cpt = static_cast<const char*>((Marshal::StringToHGlobalAnsi(src)).ToPointer());

    // エンコーディングを指定してバイト数を取得します。
    Encoding^ encoding = Encoding::GetEncoding(encoding);
    int cptLen = encoding->GetByteCount(cpt);

    // char型に変換した文字列を返却用char型変数にコピーします。
    strncpy_s(dst, dstLen, cpt, cptLen);

    // 変換したchar型の文字列を解放します。
    Marshal::FreeHGlobal(IntPtr((void*)cpt));
}

API Reference
Marshal.StringToHGlobalAnsiメソッド
Marshal.FreeHGlobalメソッド

おわりに

もっと簡単にできると思ったのですが、案外面倒でした。
おとなしくString型だけで文字列を処理できる環境であればいいのですが、過去のC/C++の資産を流用するようなプロジェクトの場合、こういった変換が必要になってきます。

Tech Boost

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688