C#从IP地址字符串中删除尾随’\ 0′

我在TCP套接字上收到了一个字符串。 这个字符串看起来像这样:

str = "10.100.200.200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; 

我应该如何解析这个IPAddress? 如果我这样做,

 IPAddress.TryParse(msg.nonTargetIP.Trim(), out ip); 

它无法解析。

删除那些尾随null的最简单方法是什么?

 IPAddress.TryParse(msg.nonTargetIp.Replace("\0", String.Empty).Trim(), out ip); 

或者读取Trim(),您可以执行以下操作,这可能更快:

 IPAddress.TryParse(msg.nonTargetIp.TrimEnd(new char[] { '\0' } ), out ip); 

其他示例向您展示了如何修剪字符串 – 但最好不要让“坏”数据开始。

我的猜测是你有这样的代码:

 // Bad code byte[] data = new byte[8192]; stream.Read(data, 0, data.Length); string text = Encoding.ASCII.GetString(data); 

这忽略了Stream.Read的返回值。 你的代码应该是这样的:

 // Better code byte[] data = new byte[8192]; int bytesRead = stream.Read(data, 0, data.Length); string text = Encoding.ASCII.GetString(data, 0, bytesRead); 

请注意,您还应检查流是否已关闭,并且不要假设您将能够读取一次调用Read所有数据,或者在另一端调用Write对应于一次调用Read

当然完全有可能根本不是这种情况 – 但你应该检查另一端是否试图在数据末尾发送这些额外的“空”字节。 这听起来不太可能。

str = str.Replace("\0",""); 应该工作得很好。

与Replace方法相比,Trim方法更有效。

 msg.nonTargetIP.Trim(new [] { '\0' }); 

您可以尝试更换字符串而不是修剪:

 IPAddress.TryParse(msg.nonTargetIP.Replace("\0", ""), out ip); 

可以使用TrimEnd()

 bool isIPAddress = IPAddress.TryParse(msg.nonTargetIP.nonTargetIP.TrimEnd('\0'), out ip); 

但请注意,您提供的示例包含非法IP地址,并且无论如何都不会成功解析(300> 255,每个十进制数必须在2到255之间)。