web-dev-qa-db-ja.com

C#の文字列からのchar *ポインター

C#でstring変数のchar*を取得することはできますか?

ネイティブwin32関数を使用するには、パス文字列をchar*に変換する必要があります...

31
Kris

StringBuilderchar*として渡すことができます。

http://pinvoke.net を見て、関数の署名がまだないかどうかを確認してください。

13
Geoff

さて、あなたは確かにこれを行うことができます:

string str = "my string";

unsafe 
{
    fixed (char* p = str)
    {               
        // do some work
    }
}

文字列オブジェクトにバインドされた演算子(char *)があります。ただし、出力形式は、基礎となるCまたは他の形式と互換性がない可能性があります。ただし、これは文字列を解析するための非常に優れたソリューションです。この投稿を読んでいる人にとって役立つことを願っています。

44

次のコードには安全でないコンテキストは必要ありません(そして、stringGetHashCodeメソッドの実装に関する内部のボルトとビットは、Javaは、C#ではハッシュコードの値がキャッシュされず、一般的に、C#文字列が最終的に不変ではないことを示しているため、教えられた可能性があり、Fon Neimanに対処できない):

using System;
using System.Runtime.InteropServices;

namespace Guess
{
    class Program
    {
        static void Main(string[] args)
        {
            const string str = "ABC";

            Console.WriteLine(str);
            Console.WriteLine(str.GetHashCode());

            var handle = GCHandle.Alloc(str, GCHandleType.Pinned);

            try
            {
                Marshal.WriteInt16(handle.AddrOfPinnedObject(), 4, 'Z');

                Console.WriteLine(str);
                Console.WriteLine(str.GetHashCode());
            }
            finally
            {
                handle.Free();
            }
        }
    }
}
5
Lu4

既に指定された2つのアンワーを組み合わせるには、パラメーターに必要な方向によって異なります。

関数が入力文字列、つまりconst char *だけを必要とする場合、System.String(またはプレーンstring)型の引数を使用できます。

関数が文字列、つまりchar * buffer, int bufferSizeを埋める場合、System.Text.StringBuilderを渡すことができます。

どちらの場合も、(自動)マーシャリングが必要な変換を行います。

4
Henk Holterman

それはあなたが何をしたいかに依存します。 PInvokeを介してWin32関数を呼び出すときは、String変数を渡すことができるはずです。フレームワークはすべてをマーシャリングします。もっと複雑なものが必要な場合は、 Marshal.StringToHGlobalAnsi およびMarshalクラスの他のメソッドをご覧ください。

4
Heinzi

Encoding.ASCII.GetBytesを使用して、文字列からbyte []配列を取得できます。これはおそらく、C#のfixedステートメントを使用してchar *に変換できます。 (これは割り当てられたメモリを固定し、gcがそれを移動することを許可しません-その後、ポインタを作成できます)。

ですから、byte *をchar *に変換できた場合にのみ、私の答えはイエスです。 (C/C++ではこれは問題になりませんが、C#についてはわかりません)

PS>この記事のブックマークを見つけたら、後でコードを投稿します。どこかにあるのは知っています。

0
kubal5003