Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44

Ошибка IPAddress.ToString()!?

13.01.2019, 21:55. Показов 2694. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
IPAddress ip = new IPAddress(1);
Console.WriteLine($"{ip.ToString()}");
Выдаёт IP "1.0.0.0".

Как это понимать?

Должно выдать 0.0.0.1 или я что-то не понимаю?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2019, 21:55
Ответы с готовыми решениями:

При вычислении выражения ++i.ToString() сначала вычисляется ToString(), а потом ++
При вычислении выражения ++i.ToString() сначала вычисляется ToString(), а потом ++. Соответственно, это не работает, работает...

Разница между string.Concat(x,y) и x.ToString()+y.ToString()
Вроде как одно и то же, но дает разные результаты в операции поиска палиндромов. К примеру, взять число 1010: ...

Ошибка при переопределении ToString()
Здравствуйте, уважаемые форумчане. Имеется 2 класса: Commodity(абстрактный), Product В каждом из классов переопределен метод ToString(). ...

43
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
14.01.2019, 00:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Maaaxxx Посмотреть сообщение
но при конвертации "255.255.255.255" в десятичное число, не хватит 2 млрд значений
255.255.255.255 это 4 байта можете проверить
C#
1
2
3
4
5
byte[] b = new byte[] {255,255,255,255};
 
Console.WriteLine(new IPAddress(b));
 
Console.WriteLine(sizeof(int)); // 4
В свою очередь Int32 занимает 4 байта
0
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
14.01.2019, 00:17  [ТС]
IamRain я привёл код, который показывает, что 255.255.255.255 при представлении в десятичное число на 2 млрд больше int32.MaxValue. У меня ошибка в формуле преобразования ip в десятичное число?

Добавлено через 2 минуты
WODICHKA , в число переведите 255.255.255.255, а не в байты. И увидите, что в десятичном представлении это значение больше int32.MaxValue. Я даже код дал, введите его в Студии и запустите программу. Цифры говорят сами за себя. Это в формате "*.*.*.*" хватает 4 байт, а в десятичном 4 байт не хватит.
0
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
14.01.2019, 00:17
Цитата Сообщение от Maaaxxx Посмотреть сообщение
на 2 млрд больше int32.MaxValue
Int = 4 байта 32 бита соотственно максимальное число которое он может хранить равно
2^32 - 1 = 4294967295 == uint.max
0
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
14.01.2019, 00:20  [ТС]
Someone007 , верно!!!) Есть же uint, в него ipv4 прекрасно влезет. Я даже больше скажу. uint.MaxValue соответствует как раз 255.255.255.255. Но я храню значения в MS SQL, поэтому пришлось использовать long.

Добавлено через 37 секунд
WODICHKA вы видели ip с отрицательными числами?)

Добавлено через 26 секунд
Точно, я могу привести long к uint и тогда получу 4 байта. Спасибо всем огромное!!!
0
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
14.01.2019, 00:21
Цитата Сообщение от Maaaxxx Посмотреть сообщение
WODICHKA вы видели ip с отрицательными числами?)
Причем вообще числа и IP это разные вещи IP это 4 последовательных байта
4 байта удобно хранить в int не играет роли какое там число.

диапазон signed int: [-2 147 483 648, +2 147 483 647]
диапазон unsigned int: [0, +4 294 967 295]
0
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
14.01.2019, 00:24  [ТС]
WODICHKA int.MaxValue - это максимальное положительное число, а не сколько всего чисел. Поэтому там не 4294967295, а 2147483647

Добавлено через 1 минуту
WODICHKA на самом деле IP и десятичные числа это одно и тоже. Просто разное представление.
0
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
14.01.2019, 00:26
Цитата Сообщение от Maaaxxx Посмотреть сообщение
WODICHKA на самом деле IP и десятичные числа это одно и тоже.
Думаю вам стоит почитать про типы данных) и представление данных в памяти компьютера )
0
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
14.01.2019, 00:28  [ТС]
И потому, что это одно и тоже, я могу оперировать IP адресами как с обычными числами) Что значительно удобнее в коде. Например, вот как я могу проходиться по диапазону IP:

C#
1
2
3
4
5
6
7
                for (long i = iPRange.BeginIPDecimel; i <= iPRange.LastIPDecimel; i++)
                {
                        myList.Add(new MyIP()
                        {
                            IpDecimial = i,
                        });
                }
Или просто узнать сколько адресов в диапазоне: iPRange.LastIPDecimel - iPRange.BeginIPDecimel + 1;

Добавлено через 1 минуту
Цитата Сообщение от WODICHKA Посмотреть сообщение
Думаю вам стоит почитать про типы данных) и представление данных в памяти компьютера )
Я уже понял, что в компьютере данные хранятся по другому. Но я пишу программу. А программа - это уровень абстракции и он должен быть максимально понятным) Вы же не 0 и 1 оперируете при написании, а абстракциями над этим.
0
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
14.01.2019, 00:31
Цитата Сообщение от Maaaxxx Посмотреть сообщение
абстракции и он должен быть максимально понятным
Не совсем верно так как 4 294 967 295, не понятней чем "255.255.255.255", так что вы как раз таки спустились на один уровень абстракции ниже
0
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
14.01.2019, 00:35  [ТС]
Поэтому теперь вместо "*.*.*.*" я работаю с обычными десятичными числами. Что значительно понятнее в коде. И сам код, как показано выше, проще.

Добавлено через 2 минуты
WODICHKA вам нужно составить массив IP адресов. Как вы будете это делать?
Я делаю просто:
for (long i = iPRange.BeginIPDecimel; i <= iPRange.LastIPDecimel; i++)
Количество IP в диапазоне тоже вычисляется просто: iPRange.LastIPDecimel - iPRange.BeginIPDecimel.

Если вы будете работать с формой записи IP как "*.*.*.*" у вас так просто не получится.

Добавлено через 48 секунд
Кроме того, ваш код будет менее эффективен в плане производительности.
0
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
14.01.2019, 00:41
Цитата Сообщение от Maaaxxx Посмотреть сообщение
Кроме того, ваш код будет менее эффективен в плане производительности.
Какой мой код? О чем речь?

C#
1
2
3
4
5
6
7
8
9
10
11
public static long ConvertToDecimel(this IPAddress ipAddress)
        {
            if (ipAddress == null)
                throw new ArgumentNullException(nameof(ipAddress));
 
            string[] octets = ipAddress.ToString().Split(new Char[] { '.' });
            return (long)(Math.Pow(256, 3) * Convert.ToInt32(octets[0], CultureInfo.InvariantCulture)
                       + Math.Pow(256, 2) * Convert.ToInt32(octets[1], CultureInfo.InvariantCulture)
                       + Math.Pow(256, 1) * Convert.ToInt32(octets[2], CultureInfo.InvariantCulture)
                       + Convert.ToInt32(octets[3], CultureInfo.InvariantCulture));
        }
не стоит зарекаться о производительности имея такие методы
1
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
14.01.2019, 00:41  [ТС]
WODICHKA, я имею в виду ваш код, если бы вы работали с IP адресами.
0
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
14.01.2019, 00:42
Цитата Сообщение от Maaaxxx Посмотреть сообщение
WODICHKA, я имею в виду ваш код, если бы вы работали с IP адресами.
Всё равно не понимаю о чем речь.
0
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
14.01.2019, 00:47  [ТС]
Цитата Сообщение от WODICHKA Посмотреть сообщение
не стоит зарекаться о производительности имея такие методы
Спасибо, сейчас переделаю на перестановку байт)

Добавлено через 2 минуты
Цитата Сообщение от WODICHKA Посмотреть сообщение
Всё равно не понимаю о чем речь.
Я имею в виду вашу стратегию работы с IP адресами, а не код, который вы имеете.
0
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
14.01.2019, 00:48
Цитата Сообщение от Maaaxxx Посмотреть сообщение
Я имею в виду вашу стратегию работы с IP адресами, а не код, который вы имеете.
О какой стратегии )? Я не призывал использовать строки для обработки адресов.
0
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
14.01.2019, 00:50  [ТС]
WODICHKA, Если интересно, что имею в виду, сделайте в цикле обработку каждого IP адреса из диапазона IP. Например, вывод на экран.
Я не понимаю как можно написать простой и понятный код, который проходится по всем IP из диапазон IP.

Добавлено через 43 секунды
Цитата Сообщение от WODICHKA Посмотреть сообщение
О какой стратегии )? Я не призывал использовать строки для обработки адресов.
Я не про строки, а про представление IP в виде "*.*.*.*"
0
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
14.01.2019, 00:55
Цитата Сообщение от Maaaxxx Посмотреть сообщение
IP в виде "*.*.*.*"
Что по вашему означает это представление?
Если конвертировать uint.MaxValue к массиву байт
C#
1
2
3
4
5
6
uint ip_val = uint.MaxValue;
byte[] bytes = BitConverter.GetBytes(ip_val);
[0] => 255
[1] => 255
[2] => 255
[3] => 255
Асболютно тот же результат будет если конвертировать Int32 -1
C#
1
2
3
4
5
6
int ip_val = -1;
byte[] bytes = BitConverter.GetBytes(ip_val);
[0] => 255
[1] => 255
[2] => 255
[3] => 255
Вы пытаетесь связать 4 последовательных байта и число.
Да действительно если представить IP в виде числа без знака то можно удобно бегать по диапазонам адресов.
Другое дело, что не представляю себе задачи при которой мне бы пришлось бегать по диапазону адресов (как это делаете вы подряд)
0
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
14.01.2019, 01:16  [ТС]
Спасибо всем огромное!
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
14.01.2019, 01:35
Цитата Сообщение от Maaaxxx Посмотреть сообщение
255.255.255.255 при представлении в десятичное число на 2 млрд больше int32.MaxValue
Конечно больше, так как int32.MaxValue - это (2^7 - 1), так как int32 - знаковое, то есть старший его бит не используется для представления величины.

А Адрес 255.255.255.255 - это 2^8 - 1. - То есть в два раза больше.
Именно поэтому для представления IPAddress-ов используется знаковый long (Int64) тип.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var fromIntMax = new IPAddress(int.MaxValue);
Console.WriteLine($"From int32.Max: {fromIntMax}"); // 255.255.255.127
 
// играемся с 255.255.255.255
// IPv4
IPAddress address = new IPAddress(new byte[] { 255, 255, 255, 255 });
var bytes = address.GetAddressBytes();
 
var bytesToConvert = new byte[8];
for (int i = 0; i < bytes.Length; i++)
          bytesToConvert[i] = bytes[i];
 
var val = BitConverter.ToInt64(bytesToConvert, 0);
var ipAddress2 = new IPAddress(val);
Console.WriteLine(address.ToString());
Console.WriteLine(ipAddress2.ToString());
Console.WriteLine($"Equals: {address.Equals(ipAddress2)}");
Таки да, спасибо, что поправили.

Добавлено через 7 минут
Ну и резюмируя, если при одном и том же представлении числа, скажем
0xABCD мы знаем, что объект, его использующий, интерпретирует числа в BigEndian формате, то число D (наименее значащий) в этой Hex-записи будет находится по наибольшему (старшему) адресу, в LittleEndian - по наименьшему.

Добавлено через 6 минут
Насколько я понял, сама запись числа - это и есть BigEndian формат, то есть старшие - слева, младшие - справа,
поэтому BigEndian формат - прямой порядок байт, как сказал, kolorotur.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.01.2019, 01:55
Цитата Сообщение от Maaaxxx Посмотреть сообщение
Я не понимаю как можно написать простой и понятный код, который проходится по всем IP из диапазон IP.
Держите.
C#
1
2
3
4
5
6
7
8
9
10
static IEnumerable<IPAddress> EnumerateIpRange(IPAddress from, IPAddress to)
{
    var buffer = from.GetAddressBytes();
    do
    {
        yield return from = new IPAddress(buffer);
        int i = buffer.Length - 1;
        while (i >= 0 && ++buffer[i] == 0) i--;
    } while (!from.Equals(to));
}
Метод перечисляет все IP-адреса в диапазоне между from и to:
C#
1
2
3
4
5
var from = IPAddress.Parse("0.0.0.0");
var to = IPAddress.Parse("255.255.255.255");
 
foreach (var ip in EnumerateIpRange(from, to))
    Console.WriteLine(ip);
С IPv6 тоже работает.

Цитата Сообщение от IamRain Посмотреть сообщение
так как int32 - знаковое, то есть старший его бит не используется для представления величины.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2019, 01:55
Помогаю со студенческими работами здесь

Sockets , IPAddress
Имею такой вот фрагмент кода : IPAddress ipa = Dns.GetHostAddresses(&quot;Q-PC&quot;); for(int i = 0;i &lt;...

Из string в IPAddress
Уважаемые форумчане. Собственно суть вопроса в названии... как?

Как отсеять ip-v4 из IPAddress
дело в том, что Dns.GetHostAddresses загоняет в IPAddress сначала ipv6, а потом для того же подключения ipv4. если на компе одно сетевое...

Как проинитить Dictionary<string,IPAddress>
Надо проинициализировать: private const Dictionary&lt;string,IPAddress&gt; url = new Dictionary&lt;string,IPAddress&gt; ...

Как получить IPAddress сокета, отправившего сообщение
Добрый вечер, работаю над клиент-серверным приложением. И столкнулась с такой проблемой, мне нужно узнать ip адрес с которого отправили...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru