C # Удаление конечного '\ 0' из строки IP-адреса - PullRequest
4 голосов
/ 13 июля 2011

Я получил строку через сокет TCP. И эта строка выглядит примерно так:

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);

не удается разобрать.

Какой самый простой способ удалить эти завершающие нули?

Ответы [ 6 ]

14 голосов
/ 13 июля 2011

Другие примеры показали вам, как обрезать строку, но было бы лучше не получать «плохие» данные для начала.

Мой думаю , что у вас есть такой код:

// 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.

Конечно, вполне возможно, что это совсем не так, но вы должны действительно проверить, является ли другой конец попыткой отправить эти дополнительные "нулевые" байты в конце данных. Это звучит маловероятно для меня.

13 голосов
/ 13 июля 2011
IPAddress.TryParse(msg.nonTargetIp.Replace("\0", String.Empty).Trim(), out ip);

В качестве альтернативы, читая Trim () , вы можете сделать следующее, что, вероятно, быстрее:

IPAddress.TryParse(msg.nonTargetIp.TrimEnd(new char[] { '\0' } ), out ip);
5 голосов
/ 13 июля 2011

str = str.Replace("\0",""); должно работать просто отлично.

4 голосов
/ 13 июля 2011

Метод Trim более эффективен по сравнению с методом Replace.

msg.nonTargetIP.Trim(new [] { '\0' });
1 голос
/ 13 июля 2011

Вы могли бы просто использовать TrimEnd() для этого:

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

Обратите внимание, что приведенный вами пример содержит недопустимый IP-адрес и никогда не будет успешно проанализирован независимо (300 -> 255, каждое десятичное число должно находиться в диапазоне от 2 до 255).

1 голос
/ 13 июля 2011

Вы можете попробовать заменить строку вместо обрезки:

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