C#移除尾随#x27\0';来自IP地址字符串

C#移除尾随#x27\0';来自IP地址字符串,c#,string,ip-address,C#,String,Ip Address,我通过TCP套接字接收到一个字符串。这个字符串看起来像这样: str = "10.100.200.200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; // Bad code byte[] data = new byte[8192]; stream.Read(data, 0, data.Length); string text = Encoding.ASCII.GetString(data); 我应该如何将其解析为IP地址?如果我这样做 IPAddress.TryParse

我通过TCP套接字接收到一个字符串。这个字符串看起来像这样:

str = "10.100.200.200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
// Bad code
byte[] data = new byte[8192];
stream.Read(data, 0, data.Length);
string text = Encoding.ASCII.GetString(data);
我应该如何将其解析为IP地址?如果我这样做

IPAddress.TryParse(msg.nonTargetIP.Trim(), out ip);
它无法解析


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

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

IPAddress.TryParse(msg.nonTargetIP.Replace("\0", ""), out ip);
str=str.Replace(“\0”,“0”)应该可以正常工作

IPAddress.TryParse(msg.nonTargetIp.Replace("\0", String.Empty).Trim(), out ip);
或者,你可以做以下可能更快的事情:

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

与替换方法相比,修剪方法更有效

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

其他示例已经向您展示了如何修剪字符串,但最好不要从“坏”数据开始

我猜你有这样的代码:

str = "10.100.200.200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
// Bad code
byte[] data = new byte[8192];
stream.Read(data, 0, data.Length);
string text = Encoding.ASCII.GetString(data);
这将忽略
流的返回值。读取
。您的代码应该是这样的:

// 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
的一次调用


当然,完全有可能根本不是这样,但是您应该真正检查另一端是否试图在数据的末尾发送这些额外的“null”字节。这听起来不太可能。

您可以使用
TrimEnd()
来实现:

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

但是请注意,您给出的示例包含非法IP地址,无论如何都无法成功解析(300大于255,每个十进制数必须在2到255之间).

是否有过这样的情况,即在第一个“\”之前有数据需要保留?尾随字符是文本反斜杠还是空字符?我已经在使用“更好的代码”版本了。但问题是我正在处理byte[]数据并对其进行解析。@ceonikka:您控制服务器了吗?这是垃圾数据吗?我是服务器,客户机大多是Java/C++实现。@ceonikka:好的,协议对他们应该发送给你的内容有什么规定?如何知道字符串的结束位置?修剪/替换解决方案肯定会起作用-但请记住它们不会更改现有字符串;他们将返回一个新字符串。我不会使用
Split
——我会编写一个方法来实现这一点,它将使用
IndexOf
查找第一个
\0
并返回之前的所有内容。