C#でstring
変数のchar*
を取得することはできますか?
ネイティブwin32関数を使用するには、パス文字列をchar*
に変換する必要があります...
StringBuilder
をchar*
として渡すことができます。
http://pinvoke.net を見て、関数の署名がまだないかどうかを確認してください。
さて、あなたは確かにこれを行うことができます:
string str = "my string";
unsafe
{
fixed (char* p = str)
{
// do some work
}
}
文字列オブジェクトにバインドされた演算子(char *)があります。ただし、出力形式は、基礎となるCまたは他の形式と互換性がない可能性があります。ただし、これは文字列を解析するための非常に優れたソリューションです。この投稿を読んでいる人にとって役立つことを願っています。
次のコードには安全でないコンテキストは必要ありません(そして、string
のGetHashCode
メソッドの実装に関する内部のボルトとビットは、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();
}
}
}
}
既に指定された2つのアンワーを組み合わせるには、パラメーターに必要な方向によって異なります。
関数が入力文字列、つまりconst char *
だけを必要とする場合、System.String
(またはプレーンstring
)型の引数を使用できます。
関数が文字列、つまりchar * buffer, int bufferSize
を埋める場合、System.Text.StringBuilder
を渡すことができます。
どちらの場合も、(自動)マーシャリングが必要な変換を行います。
それはあなたが何をしたいかに依存します。 PInvokeを介してWin32関数を呼び出すときは、String変数を渡すことができるはずです。フレームワークはすべてをマーシャリングします。もっと複雑なものが必要な場合は、 Marshal.StringToHGlobalAnsi およびMarshal
クラスの他のメソッドをご覧ください。
Encoding.ASCII.GetBytesを使用して、文字列からbyte []配列を取得できます。これはおそらく、C#のfixedステートメントを使用してchar *に変換できます。 (これは割り当てられたメモリを固定し、gcがそれを移動することを許可しません-その後、ポインタを作成できます)。
ですから、byte *をchar *に変換できた場合にのみ、私の答えはイエスです。 (C/C++ではこれは問題になりませんが、C#についてはわかりません)
PS>この記事のブックマークを見つけたら、後でコードを投稿します。どこかにあるのは知っています。