将System :: String转换为wchar_t * - 如何确定结束?

时间:2011-05-24 20:49:33

标签: .net visual-c++ c++-cli interop

这个过程在这里解释: http://msdn.microsoft.com/en-US/library/d1ae6tz5%28v=VS.80%29.aspx 我从那篇文章中得不到的是,固定的wchar_t *被传递给依赖于尾随空字符的各种C字符串函数。 .NET字符串是否具有尾随空字符的规则? System.String文档说:

  

在.NET Framework中,空字符可以嵌入到字符串中。当字符串包含一个或多个空字符时,它们将包含在总字符串的长度中。

2 个答案:

答案 0 :(得分:2)

根据我的理解,.NET CLR字符串中的内部字符缓冲区是以空值终止的,尽管自然空字符不会使其成为字符数,因此任何.NET代码都会忽略它。 null的唯一原因是为了便于与Windows API或其他普通C代码互操作,这些代码要求字符串以空值终止。每当.NET字符串必须传递给C API(并且可能不得不重新分配和复制整个字符串)时,不是追加空字符,而是从第一位开始就是空字符 - 真实的有用优化-world,因为.NET仍然需要在幕后进行大量的互操作,即使你没有明确地使用它。

如果你碰巧在字符串的中间中有一些空字符,那么获取字符串的任何C API都可能会停在那里并且永远不会到达字符串的末尾。我想你甚至可以自己在C ++ / CLI中试一试,看看会发生什么。 :)

答案 1 :(得分:0)

猜测,因为我无法访问Microsoft内部。

没有明确说明,但是wchar_t *字符串应始终以null字符终止。该示例支持此功能,因为它使用printf_s函数,该函数取决于此特性。

PtrToStringChars函数授予对内部字符串缓冲区的访问权限。函数可以将空字符附加到缓冲区而不将其包含在字符串的字符数中,因此字符串的.NET用户不会看到null。