2011-07-13 43 views
4

我通过TCP套接字接收到一个字符串。这个字符串看起来像这样:C#从IP地址字符串中删除尾部' 0'

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

我应该如何解析这个IP地址?如果我这样做,

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

它无法解析。

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

+1

是否曾经有过在第一个'\'之前会有数据需要保留的情况? – MoarCodePlz

+2

尾部字符是反斜杠还是空字符? –

回答

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

或者读了上Trim()你可以做的是可能会比较快的情况如下:

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

工作完美!谢谢:-) – ceonikka

1

你可以尝试的字符串替换,而不是微调的:

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

str = str.Replace("\0","");应该只是罚款。

4

裁剪方法相比,替换方法更有效。

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

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

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

// 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的一个呼叫。

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

+0

我已经在使用“更好的代码”版本。但问题是我使用byte []数据并解析它。 – ceonikka

+0

@ceonikka:你在控制服务器吗?这是垃圾数据的预期? –

+0

我是服务器,客户端主要是Java/C++实现。 – ceonikka

1

可以只使用此TrimEnd():但你给的例子中包含非法IP地址,永远不会成功解析无论

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

注(300> 255,每一个十进制数必须是在2到255的范围内)。

0

即使你的意图不是很清楚,如果你想要的是摆脱那些尾随“\ 0”的那么这行应该做的和你返回IPv4地址:

str = str.Substring(0,str.LastIndexOf('.')+4); 

希望它可以帮助!

+0

不,它不会。如果他的str =“10.100.200.2 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0”会怎样?您将以10.100.200.2 \ 0 – Ian

+0

@ I oops结束......我没有想到这种情况!谢谢你,指出这一点! – MrClan