Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246

Ошибка при парсинге IP

04.01.2017, 20:03. Показов 2529. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Какая-то странная ошибка возникает при парсинге строки Ip. Сама строка берётся из MaskedTextBox. Адрес 127.000.000.001 парсится нормально, а на 192.168.008.001 вылетает ошибка:
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2017, 20:03
Ответы с готовыми решениями:

Out of memory при парсинге с webBrowser
Друзья, посоветуйте почему выдает out of memory??? Есть множество ссылок на гугл.финанс с которых надо спарсить инфу, я делаю так: Я...

Исключение при парсинге JArray
Здравствуйте! Имеется JSON строка следующего типа: { "employees": } Пытаюсь ее парсить при помощи JArray.Parse(string); но...

Пустой cellRange.Value при парсинге Excel
Здравствуйте! Пишу парсер Excel. Написал шаблоны уже для множества файлов, но очередном наткнулся на проблему. Ячейки, которые содержат...

10
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.01.2017, 20:31
Лучший ответ Сообщение было отмечено ViterAlex как решение

Решение

ViterAlex, есть такое дело. А если нули убрать, все работает.
Посмотри исходники, там много чего, и unsafe код используется для разбора.

Добавлено через 3 минуты
При парсинге IPv4 используется вот этот метод, как я понял. Посмотри, как реализован парсинг.
2
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
04.01.2017, 22:54  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
есть такое дело.
Я уж думал у меня глюки. Спасибо за пояснение. Исходники я править не буду, естественно, поэтому убираю лишние нули таким образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>Удаление из IP-адреса незначащих нулей.</summary>
/// <param name="address">Строка с IP-адресом.</param>
/// <returns>Возвращает строку с IP-адресом без лишних нулей.</returns>
/// <remarks>Некоторые адреса вида 192.168.000.001, где есть незначащие нули в триадах,
/// <see cref="IPAddress.Parse"/> обрабатывает неверно. Поэтому такой адрес будет преобразован в 192.168.0.1</remarks>
public static string CleanIp(this string address)
{
    if(string.IsNullOrEmpty(address))return address;
    if (address.IndexOf(".0.", StringComparison.Ordinal) != -1) return address;
    while (address.IndexOf(".0", StringComparison.Ordinal) != -1 && address.IndexOf(".0.", StringComparison.Ordinal) == -1)
    {
        address = address.Replace(".0", ".");
    }
    return address;
}
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
04.01.2017, 23:03
Цитата Сообщение от ViterAlex Посмотреть сообщение
убираю лишние нули таким образом
Можно и вот так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
 
namespace ConsoleApplication13 {
    class Program {
        static void Main(string[] args) {
            string address = "192.168.001.008";
            IPAddress ip = address.ParseEx();
            if (ip != IPAddress.None) {
                Console.WriteLine(ip.ToString());
            }
            Console.ReadLine();
        }
    }
    static class IPExtensions {
        public static IPAddress ParseEx(this string address) {
            try {
                return new IPAddress(address.Split(new[] { '.' }).Select(a => byte.Parse(a)).ToArray());
            }
            catch (Exception ex) {
                return IPAddress.None;
            }
        }
    }
}
1
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.01.2017, 00:21  [ТС]
Городить Linq и Split я не стал ради такой мелкой задачи, хотя мысль была. Но это гораздо медленнее.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.01.2017, 00:34
Цитата Сообщение от ViterAlex Посмотреть сообщение
Адрес 127.000.000.001 парсится нормально, а на 192.168.008.001 вылетает ошибка
Замените 008 на 012 и выведите результат в консоль
Впередиидущие нули в IP-адресах имеют особый смысл.

Цитата Сообщение от ViterAlex Посмотреть сообщение
Некоторые адреса вида 192.168.000.001, где есть незначащие нули в триадах, IPAddress.Parse обрабатывает неверно.
Метод Parse их обрабатывает верно, просто существует несколько допустимых разновидностей записи IPv4 адреса и метод Parse учитывает почти все из них, а именно:
  • Разделенные точкой десятичные октеты: "192.168.0.1" -> 192.168.0.1
  • Разделенные точкой шестнадцатеричные октеты: "0xF7.0x10.0x02.0x00" -> 127.16.2.0
  • Разделенные точкой восьмеричные октеты: "012.010.001.034" -> 10.8.1.26
  • Разделенные точкой любые комбинации из вышеперечисленных: "192.0x10.012.1" -> 192.16.10.1
  • Сокращенные адреса, использующие любые комбинации из вышеперечисленных форматов: "127.1" -> 127.0.0.1; "127.0xF.3" -> 127.15.0.3
  • Просто десятичное число: "325469874" -> 19.102.70.178
  • Просто шестнадцатеричное число: "0xAC101330" -> 172.16.19.50

Единственные допустимые форматы, которые он не умеет парсить — это разделенные точкой двоичные октеты: "00001010.00001010.00000000.01111111 " -> 10.10.0.127
И просто двоичное число: "00001010000010100000000001111111" -> 10.10.0.127

Как видите, если вы в октет вставляете ноль в начале, то этот октет воспринимается парсером как представленный в восьмеричной системе счисления, потому адрес вида 192.168.008.001 не отпарсится, т.к. в восьмеричной СС нет цифры 8, а вот 127.000.000.001 отпарсится нормально, т.к. все октеты прописаны в допустимых форматах. Но, к примеру, если бы в последнем октете была не единица, а, скажем, десятка: 127.000.000.010, то такой адрес распарсился бы как 127.0.0.8, потому что впередистоящий ноль указывает парсеру на то, что октет представлен в восьмеричной СС.
2
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.01.2017, 00:35  [ТС]
kolorotur, т.е неправильно записывать IPv4 в виде 127.000.090.001, а нужно писать 127.0.90.1?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.01.2017, 00:37
Цитата Сообщение от ViterAlex Посмотреть сообщение
т.е неправильно записывать IPv4 в виде 127.000.090.001
090 — неправильно, но написать 070 было бы правильно, т.е. допустимо.

Цитата Сообщение от ViterAlex Посмотреть сообщение
а нужно писать 127.0.90.1?
Если подразумевается именно такой адрес, то лучше его прописывать без впередиидущих нулей.
С ними тоже можно, но как вы сами заметили, значение адреса может при этом поменяться.
Потому "красивости" при записи IP адреса лучше не использовать
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.01.2017, 02:02  [ТС]
kolorotur, это не «красивости». Этот адрес отдаётся в стороннюю библиотеку, которая принимает его только в виде указателя на массив из 15 символов: 12 цифр и три точки.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.01.2017, 02:11
Цитата Сообщение от ViterAlex Посмотреть сообщение
Этот адрес отдаётся в стороннюю библиотеку, которая принимает его только в виде указателя на массив из 15 символов: 12 цифр и три точки.
15 символов — это, наверное, максимальная длина? Или либа требует чтобы именно было по 3 цифры в каждом октете?
Скормите ей адрес вида 127.000.000.010 и посмотрите, куда она будет ломиться по факту: если на 127.0.0.8, то лучше попробовать все-таки передать адрес в "обычном" формате, ну или учитывать эту конвертацию самому в коде.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.01.2017, 02:47  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Скормите ей адрес вида 127.000.000.010 и посмотрите, куда она будет ломиться по факту
Ты оказался прав. Она понимает адрес как положено, это я — неуч.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2017, 02:47
Помогаю со студенческими работами здесь

Избавление от &_shy_; при парсинге страницы
Доброго времени суток. Пытаюсь спарсить страницу вот таким вот кодом WebClient wClient = new WebClient(); wClient.Encoding =...

При парсинге с помощью XDocument данные не выводятся
Добрый день, Есть хмл файл примерно с такой структурой &lt;Шапка xmlns=&quot;kk.ru&quot;&gt; &lt;Сотрудник&quot;&gt; ...

Слетела кодировка при парсинге html-страницы
Здравствуйте! Начал писать программу которая парсит сайт. В заголовке html-страницы указана следующая кодировка: &lt;meta...

Ошибка при парсинге XML
Досталась XML'ка с ошибкой, каждое случайно число строк (зависимость не искали), появляется какой то не понятный символ с кодом 0xc (так...

Ошибка в Json парсинге
Всем привет! проблема в том что при парсинге нужные данные бывают оказываются в разных разделах и за этого происходит ошибка ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru