将带有零字符元素的char数组转换为C#字符串

时间:2015-08-07 03:11:57

标签: c# c arrays string

当我从用C(WinAPI)编写的非托管代码接收数据时,它要求保留一些字节并将句柄(指针)传递给字符串。 使用Marshal.AllocHGlobal(150)做了。 作为回报,我收到了字符数,由' / 0' - C风格。 当我使用新字符串(charBuff)从这个char数组构建字符串时,它不会在' / 0'点。 好吧,我可以使用Substring + IndexOf,但是有没有优雅的方法来使用一些特殊的现有方法来剪切它?

1 个答案:

答案 0 :(得分:1)

好的,我在醒来后发现了它。

它的

  

Marshal.PtrToStringUni(IntPtr)

string MyStringFromWinAPI()
{
string result;
IntPtr strPtr = Marshal.AllocHGlobal(500);
// here would be any API that gets reserved buffer to rerturn string value
SendMessage(camHwnd, WM_CAP_DRIVER_GET_NAME_UNICODE, 500, strPtr);
// now you could follow 2 ways
// 1-st one is long and boring
char[] charBuff = new char[500];
Marshal.Copy(strPtr, charBuff, 0, 500);
Marshal.FreeHGlobal((IntPtr)strPtr);
result = new string(charBuff);
result = result.Substring(0, result.IndexOf('\0'));
return result;
// or more elegant way
result = Marshal.PtrToStringUni(strPtr);
Marshal.FreeHGlobal((IntPtr)strPtr);
return result;
}