|
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
|
||||||
Ошибка IPAddress.ToString()!?13.01.2019, 21:55. Показов 2552. Ответов 43
Метки нет (Все метки)
Как это понимать? Должно выдать 0.0.0.1 или я что-то не понимаю?
0
|
||||||
| 13.01.2019, 21:55 | |
|
Ответы с готовыми решениями:
43
При вычислении выражения ++i.ToString() сначала вычисляется ToString(), а потом ++ Разница между string.Concat(x,y) и x.ToString()+y.ToString()
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 13.01.2019, 22:20 | ||
|
1
|
||
|
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
|
|
| 13.01.2019, 22:20 | |
|
конструктор принимает на вход массив байт, так что все верно
0
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
|
|||||||
| 13.01.2019, 22:20 | |||||||
|
Насколько я понял, IPAddress воспринимает long в BigEndian-формате:
C MSDN:
Например, ipv4 - это 32 бита, то есть 4 байта: {BYTE-A)} {BYTE-B} {BYTE-C} {BYTE-D}. Соответственно в BigEndian трактовке у них будут адреса: (пусть базовый адрес - 0) BYTE-A: 0 BYTE-B: 0 + 1 BYTE-C: 0 + 2 BYTE-D: 0 + 3 Поскольку вы передали единицу, а в ней есть значение только в младшем байте, то это значение и уходит в старшую часть IPAddress-а. Чтобы инициализировать так, как вы хотите, надо передавать значение наоборот, в старший байт:
1
|
|||||||
|
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
|
||||||
| 13.01.2019, 23:09 [ТС] | ||||||
|
Я хочу использовать конструктор IPAddress, который в качестве параметра принимает long:
public IPAddress(long newAddress); Я работаю с IP адресами, как с простыми числами. Вот так я конвертирую IPAddress в число:
Логично было бы предположить, что если я передаю в конструктор public IPAddress(long newAddress) десятичное число, то оно должно быть преобразовано в соответствующее представление "*.*.*.*". Ведь есть математическое правило, что такой то ip соответствует такому-то десятичному числу. Не понимаю при чём здесь байты, если конструктор принимает значение long. Не понимаю как мне в конструктор передать десятичное число, чтобы получить правильный IP. Добавлено через 9 минут Я правильно понимаю, что моё число нужно перевести в big-endian формат и только тогда передать конструктору IPAddress? Как это сделать?
0
|
||||||
|
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
|
|||||||
| 13.01.2019, 23:38 | |||||||
1
|
|||||||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
|
||||||
| 13.01.2019, 23:40 | ||||||
|
Не стал вникать в ваш код конвертирования, к тому же вы работаете со строками - это неэффективно, и возможно, неправильно.
Есть более правильные методы получения long: 1. IPAddress.Address - можно использовать только если работаете с Ipv4. Как раз возвращает long. В связи с появлением 128-битным IpV6 это свойство устарело. 2. Правильный способ и для IpV4 и IpV6: address.GetAddressBytes()Для IPv4:
0
|
||||||
|
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
|
|
| 13.01.2019, 23:41 [ТС] | |
|
Это поле выдаёт "неправильное" значение. 0.0.0.1 не будет соответствовать 1.
0
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
|
|||
| 13.01.2019, 23:42 | |||
|
0
|
|||
|
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
|
|
| 13.01.2019, 23:43 | |
|
0
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
|
|||||||||
| 13.01.2019, 23:46 | |||||||||
0x00000001, или просто 0x1.Этому числу в BigEndian соотвествует IPAddress 1.0.0.0. А надо передавать: 0x01000000 и 0x1? Это разные числа.
0
|
|||||||||
|
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
|
|
| 13.01.2019, 23:57 [ТС] | |
|
Господа! Уловите суть. Я работаю с IP как с обычными десятичными числами. 0.0.0.1 = 1, 0.0.0.2 = 2.
Это соответствует математической формуле конвертации IP в десятичные числа. Формула: string[] octets = ipAddress.ToString().Split(new Char[] { '.' }); Math.Pow(256, 3) * Convert.ToInt32(octets[0]) + Math.Pow(256, 2)) + Math.Pow(256, 1)) + Convert.ToInt32(octets[3] Что это даёт. Если есть диапазон IP, например, 1.1.1.0-1.1.1.10, то в итоге я получаю настоящие десятичные числа, соответствующие IP адресам. В десятичном представлении это будет диапазон 16843008-16843018. Видите, числа идут последовательно. С правильными числами, я их могу использовать в циклах, математических операциях (узнать сколько адресов в диапазоне). А если использовать свойство IPAddress.Address, тогда диапазон 1.1.1.0-1.1.1.10 превращается в бессмыслицу 65793-167837953. Из этого диапазона десятичных чисел вы видите, что в диапазоне интервал в 10 адресов? Нет. Тогда и смысла нет в таком представлении ip адресов в десятичном формате. Добавлено через 2 минуты IAmRain, я понял, что конструктор IPAddress принимает формат целого числа в Big-Endian. Поэтому вопрос остался простой. Как сконвертировать long в Big-Endian формат?
0
|
|
|
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
|
||
| 13.01.2019, 23:59 | ||
|
нужно свапнуть байты местами.
1
|
||
|
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
|
|
| 14.01.2019, 00:00 [ТС] | |
|
IamRain,
При таком подходе вы сможете работать только с половиной IP адресов! long longAddress = BitConverter.ToInt32(address.GetAddressB ytes(), 0); 255.255.255.255 = long.NaxМalue (int64.MaxValue). А в вашем коде вы конвертируете в Int32 Добавлено через 1 минуту WODICHKA, не всё так просто. В long 8 байтов... А для IPAddress нужно 4 байта.
1
|
|
|
5 / 5 / 0
Регистрация: 26.03.2015
Сообщений: 37
|
|||||||
| 14.01.2019, 00:05 | |||||||
|
Добавлено через 4 минуты В вашем случае поможет функция IPAddress.HostToNetworkOrder (которая свапает байты местами) код получается такой
0
|
|||||||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
|
|
| 14.01.2019, 00:09 | |
|
0
|
|
|
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
|
||||||
| 14.01.2019, 00:12 [ТС] | ||||||
|
WODICHKA, но при конвертации "255.255.255.255" в десятичное число, не хватит 2 млрд значений, если использовать для хранения числе int32. Поэтому десятичное представление ip адреса можно хранить только в long (int64). А у long 8 байт... Вот такой цирк)
0
|
||||||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
|
|
| 14.01.2019, 00:13 | |
|
0
|
|
|
2 / 2 / 0
Регистрация: 24.07.2014
Сообщений: 44
|
|
| 14.01.2019, 00:13 [ТС] | |
|
IamRain, а вы конвертируйте 255.255.255.255 в int и в long)
0
|
|
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
|
| 14.01.2019, 00:14 | |
|
1
|
|
| 14.01.2019, 00:14 | |
|
Помогаю со студенческими работами здесь
20
Sockets , IPAddress
Как отсеять ip-v4 из IPAddress Как проинитить Dictionary<string,IPAddress>
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|