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

y2k*_*y2k 15 c# string cstring

我正在使用低级本机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)";
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*her 35

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

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

s = s.Replace("\0", "");

var strings =  s.Split(new char[] {'\0'}, StringSplitOptions.RemoveEmptyEntries);
Run Code Online (Sandbox Code Playgroud)

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

s = s.Substring(0, Math.Max(0, s.IndexOf('\0')));
Run Code Online (Sandbox Code Playgroud)


Jas*_*ams 6

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

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

s = s.Trim('\0');
Run Code Online (Sandbox Code Playgroud)

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

int pos = s.IndexOf('\0');  
if (pos >= 0)
    s = s.Substring(0, pos);
Run Code Online (Sandbox Code Playgroud)


MrH*_*DEn 5

// 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"
Run Code Online (Sandbox Code Playgroud)

  • @TomLeys您忘记了 Split() 方法的第二个“2”参数。在这种情况下,数组将包含 1 个或 2 个成员。 (3认同)

Jas*_*n M 0

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