在C#中帮助\ 0终止字符串

我正在使用低级本机API,我发送一个不安全的字节缓冲区指针来获取一个c-string值。

所以它给了我

// using byte[255] c_str string s = new string(Encoding.ASCII.GetChars(c_str)); // now s == "heresastring\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(etc)"; 

所以显然我做得不对,我怎么摆脱多余的?

.NET字符串不是以空值终止的(正如您可能已经从中猜到的那样)。 所以,你可以像对待任何正常角色一样对待’\ 0’。 正常的字符串操作将为您解决问题。 以下是一些(但不是全部)选项。

 s = s.Trim('\0'); s = s.Replace("\0", ""); var strings = s.Split(new char[] {'\0'}, StringSplitOptions.RemoveEmptyEntries); 

如果你肯定想在第一个空字符后丢弃任何值,这可能对你更好。 但要小心,它只适用于实际包含空字符的字符串。

 s = s.Substring(0, Math.Max(0, s.IndexOf('\0'))); 

可能有一个选项可以在转换中去除NUL。

除此之外,你可以用以下方法清理它:

 s = s.Trim('\0'); 

…或者,如果您认为某些NUL之后可能存在非NUL字符,则可能更安全:

 int pos = s.IndexOf('\0'); if (pos >= 0) s = s.Substring(0, pos); 
 // s == "heresastring\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(etc)" s = s.Split(new[] { '\0' }, 2)[0]; // s == "heresastring" 

System.Runtime.InteropServices.Marshall.PtrToString*方法之一怎么样?

Marshal.PtrToStringAnsi – 将所有字符从非托管ANSI字符串复制到第一个空字符到托管字符串,并将每个ANSI字符扩展为Unicode。

Marshal.PtrToStringUni – 分配托管String并将全部或部分副本复制到非托管Unicode字符串的第一个null中。

我相信\ 0在ascii中是“null” – 你确定你得到的字符串实际上是ascii编码的吗?