2012-04-11 12 views
3

私はC#コードで(安全でないセクションで)char *を扱っています。 C#からstrlen関数を呼び出す方法はありますか?ヌルターミネータを検索するカスタムstrlen関数を書く必要があることは、常識に反するものです。 C#または私がアクセスできる同様のメソッドからstrlenを呼び出す方法はありませんか?C#でchar *を扱う(strlen関数?)

大きな図では、char *を文字列オブジェクトに変換しようとしていますが、文字はANSCII形式です。したがって、.NET Encoding.Convert名前空間を使用して変換します。しかし、私はそれをする前に文字列の長さを知る必要があります。

+0

@dlev私はScintilla環境からこのchar *を取得しているので、私はそれを制御できません。私は長さを直接得ることはありませんが、私はいくつかの他のものからそれを計算することができます。私はちょうどあなたがchar *を扱えるようにするならば、C#でstrlenに相当する処理をする方法がなければならないと考えました。私はこのことを考えるのが初めてではないことを知っています。 – Ian

+1

'char'は2バイト幅です。したがって、' char * 'がシングルバイトデータを指している場合は、ヌルターミネータがまったく見つからないことがあります。 – phoog

答えて

5

Marshal.PtrToStringAnsi()はあなたが必要なものを正確に行います。

は、管理対象の文字列をコピー、それにアンマネージメモリに格納されている文字列から最初の NULL文字までのすべての文字を割り当てます。

なお、この方法は、実際kernel32.dllからわずかインポートされポインタ、上lstrlenAを呼び出します。つまり、はありません。は管理された「この管理されていない文字列の長さを取得してください」メソッドであると思われます。

+0

+1ポイントが良いですが、データにはヌル終了文字が必要です(その存在は必須ではありません)。 OPのためにこれがOKかどうか確認する必要があります。 – Tigran

+1

@Tigran OPの要件は、ヌル終了文字の存在を前提としています。おそらく、不正なデータがアクセス違反の原因となるリスクを理解しているはずです。 – phoog

+1

@Tigran私はヌルターミネーターが存在すると仮定しています。それがない場合は、私はかなり迅速に知ることができますが、それは明らかに常にです。 – Ian

関連する問題