0
a。C/C#Marshal.PtrToStringAnsi中国語文字化け:
static void onMessage(IntPtr str)
{
string message = Marshal.PtrToStringAnsi(str);
Console.Write(message);
}
、その戻り中国人が文字化け。
Bを。
public static void onMessage(IntPtr str)
{
int nAnsiLength = Marshal.PtrToStringAnsi(str).Length;
int nUniLength = Marshal.PtrToStringUni(str).Length;
int nMaxLength = (nAnsiLength > nUniLength) ? nAnsiLength : nUniLength;
int length = 0;//循环查找字符串的长度
for (int i = 0; i < nAnsiLength; i++)
{
byte[] strbuf1 = new byte[1];
Marshal.Copy(str + i, strbuf1, 0, 1);
if (strbuf1[0] == 0)
{
break;
}
length++;
}
byte[] strbuf = new byte[length];
Marshal.Copy(str, strbuf, 0, length);
string message = System.Text.UTF8Encoding.UTF8.GetString(strbuf);
}
、中国の表示が、文字列の長さが返される。
私は助けが必要!
誰があなたに文字列を送信しますか? C関数? 'strbuf'の内容は何ですか?そして予想される文字列? – xanatos
[UnmanagedFunctionPointer(CallingConvention.StdCall)] パブリックデリゲートボイドWriteToConsoleCallback(のIntPtr STR)「」SetRecvDataCallback setRecvDataCallback = (SetRecvDataCallback)Marshal.GetDelegateForFunctionPointer(hapi2、typeof演算(SetRecvDataCallback))。 コールバック=新しいWriteToConsoleCallback(onMessage); setRecvDataCallback(コールバック); – aiwll
これらは非公開のライブラリの機能です... 'strbuf'(16進数)と欲しいテキストの内容を教えてください(あなたが知っていれば) – xanatos