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

ceo*_*kka 4 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";
Run Code Online (Sandbox Code Playgroud)

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

IPAddress.TryParse(msg.nonTargetIP.Trim(), out ip);
Run Code Online (Sandbox Code Playgroud)

它无法解析.

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

Jon*_*eet 14

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

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

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

这忽略了返回值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);
Run Code Online (Sandbox Code Playgroud)

请注意,您应该检查流是否已关闭,并且不要假设您能够在一次呼叫中读取所有数据Read,或者Write在另一端的一次呼叫对应于一次呼叫Read.

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

  • 修剪/替换解决方案肯定会起作用 - 但请记住它们不会改变现有的字符串; 他们将返回一个*new*字符串.我不会使用`Split` - 我会编写一个方法来执行此操作,它将使用`IndexOf`来查找第一个`\ 0`并在此之前返回所有内容. (2认同)

Ian*_*Ian 13

IPAddress.TryParse(msg.nonTargetIp.Replace("\0", String.Empty).Trim(), out ip);
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

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