Здравствуйте, Дюша, Вы писали:
Д>Здравствуйте, Mika Soukhov, Вы писали:
MS>>Буду краток — ужас.
Д>Колхоз — дело добровольное! Не нравится, перепеши. Это copy/paste из примера шедшего вместе с платной базой IP/Country.
А они тоже наверно на форуме где нить спросили, студента взяли на работу
Здравствуйте, Дюша, Вы писали:
Д>Колхоз — дело добровольное! Не нравится, перепеши. Это copy/paste из примера шедшего вместе с платной базой IP/Country.
K>if (addr.AddressFamily == AddressFamily.InterNetworkV6)
K> throw new NotSupportedException("IPv6 идет лесом");
K>
Изначально задача стояла перевести IP адрес в int32. IPv6 идёт лесом, но на нём жизнь не заканчивается.
Будут ещё IPv8/2 размером также 4 байта и IPv27 размером в 29 байт.
Так что корректно именно взять размер массива и посмотреть, четыре там байта или не четыре.
Ещё куда ни шло проверять так
if (addr.AddressFamily != AddressFamily.InterNetworkV4)
throw new NotSupportedException("Only IPv4 supported in this release");
Но, как я уже говорил, IPv8/2 тоже может быть преобразован в Int32 и кидать исключение нет надобности.
Лирическое отступление
Разработчики WindowsNT 4.0, написали regedit.exe, который читает заголовок .reg файла и если там написано не REGEDIT4, то пытаются читать его как reg-файл от WindowsNT 3.1.
Теперь представьте, как веселились те же разработчики, когда обнаружили, что в Windows2000 нужно опять поменять формат .reg-файлов, но regedit от WindowsNT 4.0, увидев REGEDIT5 и проверив эту строку на REGEDIT4 решает что это .reg-файл от Windows NT 3.1 и тупо стреляется.
Именно поэтому .reg-Файлы от Windows2000 имеют заголовок "Windows Registry Editor Version 5.00" а не REGEDIT5, как это было в первой бете Windows2000.
Вобщем думайте о завтрашнем дне и когда дело доходит до версий никогда не используйте операторы == и !=
Здравствуйте, Блудов Павел, Вы писали:
БП>Вобщем думайте о завтрашнем дне и когда дело доходит до версий никогда не используйте операторы == и !=
Я не был бы так категоричен… Ты сам сказал, что БП>Ещё куда ни шло проверять так
БП>if (addr.AddressFamily != AddressFamily.InterNetworkV4)
БП> throw new NotSupportedException("Only IPv4 supported in this release");
Просто часто удобно версии именовать "не-comparable" величинами, а именно "equatable", чо бы потом делать switch, например, вместо ветвлений со сравнениями. Смотря, чего надо добиться.
ЗЫ: БП>Изначально задача стояла перевести IP адрес в int32.
Здравствуйте, Блудов Павел, Вы писали:
БП>Здравствуйте, ksg71, Вы писали:
БП>Вобщем думайте о завтрашнем дне и когда дело доходит до версий никогда не используйте операторы == и !=
собственно своим кодом я хотел проиллюстрировать возможность использовать GetHashCode() для решения вопроса,
и он "завязан" на текущую реализацию данного метода в типе IPAddress
public override int GetHashCode()
{
if (this.m_Family != AddressFamily.InterNetworkV6)
{
return (int) this.m_Address;
}
. . .
}
и моя реплика вовсе не о том как проверять версии, но раз уж речь зашла, то я поступил аналогично MS
и сделал правильно ибо решение использует именно сегодняшнее положение вещей
public long Address
{
get
{
if (this.m_Family == AddressFamily.InterNetworkV6)
{
throw new SocketException(SocketError.OperationNotSupported);
}
return this.m_Address;
}
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Здравствуйте, <Аноним>, Вы писали:
А>Подставь в свой код IPAddress.Parse("192.168.255.255") и посмотри что получилось.
Если Вы про порядок байт, то в задаче он не оговаривался.
... << RSDN@Home 1.2.0 alpha rev. 746>>
Re: А что не так?
От:
Аноним
Дата:
12.09.07 09:14
Оценка:
Здравствуйте, Блудов Павел, Вы писали:
БП>Здравствуйте, <Аноним>, Вы писали:
А>>Подставь в свой код IPAddress.Parse("192.168.255.255") и посмотри что получилось. БП>Если Вы про порядок байт, то в задаче он не оговаривался.
Я про переполнение, так как IP нельзя приводить к int 32. Не зря свойство Address имеет тип int 64. И твой вариант будет работать в 50% случаев.
Здравствуйте, <Аноним>, Вы писали:
А>Я про переполнение, так как IP нельзя приводить к int 32. твой вариант будет работать в 50% случаев.
В остальных 50% в результате получится отрицательное число. Не вижу проблемы.
Например, для 192.168.255.255 в результате получим -22336. Нормальный такой Int32.