Comments 131
Интересный способ, не знал о таком
Честно говоря, я вот уже 10 минут пытаюсь вспомнить, _откуда_ я знаю об этом. Так и не вспомнил :-(
В студенческие годы только это знание помогло наконец понять, почему не проходит коннект на айпи 192.168.070.31. Человек набрал 070 потому, что тогда не надо точку давить — программка сама перекидывает фокус на следующий октет. И мучался два дня, ничего не понимая :-)
В студенческие годы только это знание помогло наконец понять, почему не проходит коннект на айпи 192.168.070.31. Человек набрал 070 потому, что тогда не надо точку давить — программка сама перекидывает фокус на следующий октет. И мучался два дня, ничего не понимая :-)
MAC тоже можно поразному записывать :) когда я только начинал знакомиться с cisco очень удивляла надпись вида хххх.хххх.хххх
Когда-то ооооочень давно была страничка в интернете на английском, посвящённая маскировке УРЛа, и там было написано много способов — и такой как www.list.ru@1297618184, и такие, как Вы описали… Я потом искал эту страничку — не нашёл. Возможно, эта информация у Вас оттуда же в голове отложилась и вот всплыла.
А я случайно узнал что такое longip.
Когда потребовалось написать механизм, на проверку вхождения в заданный диапазон.
Потом заменил на стандартную функцию ip2long()
Когда потребовалось написать механизм, на проверку вхождения в заданный диапазон.
Потом заменил на стандартную функцию ip2long()
На вскидку думаю так — это связанно с особенностью современной архитектуры, точнее ее 32-разрядностью.
32 бита = 4 байта = 1 двойное слово
В АйПи используется как раз 4 байта, которые хранятся в памяти в виде одного двойного слова
По моему так (с) Винни пух
о_о
32 бита = 4 байта = 1 двойное слово
В АйПи используется как раз 4 байта, которые хранятся в памяти в виде одного двойного слова
По моему так (с) Винни пух
о_о
Хром сразу в нормальный айпи конвертирует.
А огнелис вообще выдал сразу www.google.ru/ о_О
Safari can’t open the page “http://1249723236/” because Safari can’t find the server “1249723236”.
Сафари 4.0.3 на Снежном Леопарде…
Терминал пигует нормально предварительно сконвертировав в стандартный айпи.
Сафари 4.0.3 на Снежном Леопарде…
Терминал пигует нормально предварительно сконвертировав в стандартный айпи.
В PHP есть даже встроенные функции для этого:
php.net/ip2long
php.net/long2ip
Там же, в мануале, ссылка на реализацию этого же в стандартной библиотеке С. Наверное из C оно и попало в ОС, браузеры и т.п.
php.net/ip2long
php.net/long2ip
Там же, в мануале, ссылка на реализацию этого же в стандартной библиотеке С. Наверное из C оно и попало в ОС, браузеры и т.п.
Должен заметить, что там довольно странная реализация. Функция может легко давать отрицательные значения.
Да, в мануале написано:
Note: Because PHP's integer type is signed, and many IP addresses will result in negative integers, you need to use the "%u" formatter of sprintf() or printf() to get the string representation of the unsigned IP address.
Note: Because PHP's integer type is signed, and many IP addresses will result in negative integers, you need to use the "%u" formatter of sprintf() or printf() to get the string representation of the unsigned IP address.
Функция ip2long грешит.
Если возвращенное значение из функции более максимального значения целого числа: 32 бита (2147483647) или 64 бита, то производится пересчет значения в число с плавающей точкой.
Поэтому, на разных платформах, функция может выдать разные значения. будьте осторожны.
Если возвращенное значение из функции более максимального значения целого числа: 32 бита (2147483647) или 64 бита, то производится пересчет значения в число с плавающей точкой.
Поэтому, на разных платформах, функция может выдать разные значения. будьте осторожны.
squid только об этом не знает.
Полезное применение такой нотации — хранение IP-адресов в базе данных.
В строковом виде IP занимает 7-15 байт, в числовом — 4 байта.
В строковом виде IP занимает 7-15 байт, в числовом — 4 байта.
Ну и как следствие отсюда 62.149.0.62 = 62.149.62
А почему?
62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
62 * 2563 + 149 * 2562 + 62 * 2561 = 1049968128
62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
62 * 2563 + 149 * 2562 + 62 * 2561 = 1049968128
Вы написали для случая 62.149.0.62. У меня записано то же самое. А вот для 62.149.62 я действительно ошибся. ТО, что записано у меня во второй строке — это для 62.149.62.0
А для 62.149.62 будет: 62 * 2562 + 149 * 2561 + 62 * 256o = 4101438. Т.е. вс равно не равно :-)
А для 62.149.62 будет: 62 * 2562 + 149 * 2561 + 62 * 256o = 4101438. Т.е. вс равно не равно :-)
А почему так считать? Почему не 62 * 2563 + 149 * 2561 + 62 * 256?
Я не прав…
publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/libs/commtrf2/inet_addr.htm
Т.е. 62.149.62 мы понимаем как 62.149.aa.bb, где aa.bb равно 62, т.е. 00.62.
DileSoftправ :)
publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/libs/commtrf2/inet_addr.htm
The following describes the restrictions on the field values for the inet_addr subroutine:
Format Field Restrictions (in decimal)
a Value_a < 4,294,967,296
a.b Value_a < 256; Value_b < 16,777,216
a.b.c Value_a < 256; Value_b < 256; Value_c < 65536
a.b.c.d Value_a < 256; Value_b < 256; Value_c < 256; Value_d < 256
Т.е. 62.149.62 мы понимаем как 62.149.aa.bb, где aa.bb равно 62, т.е. 00.62.
DileSoftправ :)
потому что
62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
62 * 2563 + 149 * 2562 + 62 * 256O = 1049952318
62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
62 * 2563 + 149 * 2562 + 62 * 256O = 1049952318
см. выше.
Как вы узнали, что 62 нужно умножить на 1, а не на 256?
марш в школу на информатику, изучать способы перевода из одной системы счисления в другую
если в школу уже поздно. то хотя бы в гугл или википедию
если в школу уже поздно. то хотя бы в гугл или википедию
ru.wikipedia.org/wiki/Шестнадцатеричная_система_счисления
топик стартер как-то туманно обяснил процесс перевода стандартного ip адреса в целое десятичное число, хотя на само деле процесс прост
каждый байт ip адреса переводится в шестнадцатиричную систему, затем все байты записываются в одно число в том же порядке как они стоя в ip адресе, и хатем это числу переводится в десятичную систему
123.234.34.45 = 0x7B.0xEA.0x22.0x2D = 0x7BEA222D = 2078941741
топик стартер как-то туманно обяснил процесс перевода стандартного ip адреса в целое десятичное число, хотя на само деле процесс прост
каждый байт ip адреса переводится в шестнадцатиричную систему, затем все байты записываются в одно число в том же порядке как они стоя в ip адресе, и хатем это числу переводится в десятичную систему
123.234.34.45 = 0x7B.0xEA.0x22.0x2D = 0x7BEA222D = 2078941741
Да в том то и дело, что когда PHP посчитает ip2long('62.149.62') и ip2long('62.149.0.62'), то выдаст одинаковые результаты, как и С, впрочем. Всё это из-за реализации понятия «non-complete IP», насколько я понял. Т.е. IP с тремя октетами этой библиотекой считаются валидными и переводятся по другим правилам (не «дополняя» нулём спереди или сзади.
Это не имеет ничего общего со способами перевода информации, 62.149.0.62 ≠ 62.149.62 при переводе поразрядно, они равны только как ip адреса, но вот почему — не понятно.
И снова см. выше :) Это сточки из мануала к C-шной библиотеке, на её основе PHP-шная написана
Т.е. это не имеет никакого логического объяснения, просто так реализовано в самой популярной библиотеке?
логическое объяснение в том, что адрес имеет фиксированную длину, и если он у вас в формате a.b.c, то на последнюю часть отводится оставшиеся для двух разрядов 65536. то есть:
62.149.4096= 62.149.16.0
62.149.256= 62.149.1.0
62.149.62 = 62.19.0.62
62.149.4096= 62.149.16.0
62.149.256= 62.149.1.0
62.149.62 = 62.19.0.62
потому, что 62.149.0.62 = 62.149.62, 62.62 = 62.0.0.62, 127.1 = 127.0.0.1
в IP адресе 0 можно опускать, когда придет IPV6 это прочувствуется острее.
в IP адресе 0 можно опускать, когда придет IPV6 это прочувствуется острее.
Либо у меня дежавю, либо это уже недавно было на хабре
Классический пример применения union в языке C и аналогичных конструкций языка ;-)
o_O Вы о чём?
union в языке C — такая конструкция, в которую можно записать массив из четырёх байтов, а прочитать 32х-битное целое, которое будет состоять как раз из тех самых байтов.
Неужели? А то что на LE и BE значения будут разные роли не играет?
Вам никто не сказал что endiannes сохранится. Это именно способ доступа к памяти, а не преобразование. Часто еще применялось для доступа к отдельным битам флагов, типа такого:
union {
dword dwFlags;
struct {
bool bit1: 1;
bool bit2: 1;
bool bit3: 1;
bool bit4: 1;
// etc
}
}
тогда можно писать в отдельный бит, а читать из всего слова. ну или наоборот, одним махом присвоить/прочитать все значения.
union {
dword dwFlags;
struct {
bool bit1: 1;
bool bit2: 1;
bool bit3: 1;
bool bit4: 1;
// etc
}
}
тогда можно писать в отдельный бит, а читать из всего слова. ну или наоборот, одним махом присвоить/прочитать все значения.
я уже сталкивался с этим, когда писал под виндус приложение на c++ для работы с роутами с использованием библиотеки iphlpapi. там как раз при возвращении таблицы роутов все ip адреса dword'овские, а не как я надеялся получать ip в виде структуры
Чесно говоря, до последнего предложения казалось, что топик полная фигня. Но вот прикладная часть в корне меняет дело!
Здорово.
Интересна обратная процедура — есть, например, номер телефона (вместе с кодом города — как раз) — и получить такой же IP-адрес :-)
Получается unified messaging в чистом виде.
Интересна обратная процедура — есть, например, номер телефона (вместе с кодом города — как раз) — и получить такой же IP-адрес :-)
Получается unified messaging в чистом виде.
зачот
«8 * 256О» — oO, это шо?
или для наглядности?
или для наглядности?
я как-то сталкивался с айпи адресами в виде числа, если не изменяет память, то это было в ULOG в linux`e…
наверное полезно было бы в пост добавить алгоритм для обратного преобразования в традиционный вид.
наверное полезно было бы в пост добавить алгоритм для обратного преобразования в традиционный вид.
В детстве читал про это в Хакере, даже фраза была похожая: «можно записать так… так..., или даже смешивать»
магия 5349145090 1054177794
А также 9644112386 и так далее…
Что в первый раз с переполнением сталкиваетесь?
Что в первый раз с переполнением сталкиваетесь?
Не забывайте ещё про htonl/ntohl преобразования, ибо есть «сетевой» порядок байт, описанный в RFC, а есть машинный, зависящий от ОС и железа.
Иногда байты надо переворачивать…
Иногда байты надо переворачивать…
баловалка на вечер=)
Недавно проскакивало в комментариях к какому-то посту.
Капитан Очевидность припас ещё один способ записи IPv4 адресов: через их отображение в IPv6 адреса. Естественно, он будет работать только на dual-stack хостах (последние версии винды и линукса поддерживают, макось тоже, наверное). Ну и распознаёт такие адреса ещё меньшее количество ПО (проксей, блог-парсеров и т.п.).
Так, приведённый в примере 77.88.21.8 может быть записан как:
::ffff:77.88.21.8 или ::ffff:4D58:1508. В виде URL это будет: http://[::ffff:77.88.21.8]/ или http://[::ffff:4D58:1508]/
Причём вначале можно указать до 5 ноликов, причём как сначала, так и с конца пропуска:
::0:0:ffff:77.88.21.8, 0:0::ffff:4D58:1508, .., 0:0:0:0:0:ffff:77.88.21.8.
Так, приведённый в примере 77.88.21.8 может быть записан как:
::ffff:77.88.21.8 или ::ffff:4D58:1508. В виде URL это будет: http://[::ffff:77.88.21.8]/ или http://[::ffff:4D58:1508]/
Причём вначале можно указать до 5 ноликов, причём как сначала, так и с конца пропуска:
::0:0:ffff:77.88.21.8, 0:0::ffff:4D58:1508, .., 0:0:0:0:0:ffff:77.88.21.8.
Скоро придёт IPv6 и всё, никаких вам украшений адресов.
Впрочем, он уже пришёл — Freenet6 же! Я даже пробовал.
Впрочем, он уже пришёл — Freenet6 же! Я даже пробовал.
Интересно то, что хром в статье все ссылки позаменял на классический формат.
АААААА 0.10.44.42— демонический айпишник…
Это работает не везде. Не в любом браузере, не в любой OS.
А яндекс не боится хабраэффекта?
4815162342 опасно пинговать О_о
жалко, что никто не написал, откуда этот трюк взялся
я RFC полистал, но не нашел ничего такого
я RFC полистал, но не нашел ничего такого
В том-то и дело, что этот способ является вредным нарушением стандартов, описанных в RFC. Весь «трюк» заключается в том, что некоторые программы (например, броузеры) пытаются быть «умными» и превращать нестандартные незаконные URL в законные, «догадываясь», что 1234567890 — это не имя хоста, а числовой IP-адрес. С точки зрения RFC h ttp://1234567890/ (после h нужно убрать пробел) не является корректным URL с IP-адресом (1234567890 — это имя хоста, которое должно разрешаться DNS).
Другой пример нарушения стандартов, который, к сожалению, нередко используется, это HTTP URL с именем пользователя и паролем, например
h ttp://vasya:collpassword@www.acme.com/ (после h нужно убрать пробел)
Такие URL со схемой ftp: вполне валидны, но с http: — нет.
Другой пример нарушения стандартов, который, к сожалению, нередко используется, это HTTP URL с именем пользователя и паролем, например
h ttp://vasya:collpassword@www.acme.com/ (после h нужно убрать пробел)
Такие URL со схемой ftp: вполне валидны, но с http: — нет.
Линукс тогда получается тоже идет поперек стандарта: ping 1297618184 и lynx 1297618184 работают на ура.
Вы можете привести RFC, где описывается «нотация» IP-адреса? Интересно все-таки увидеть первоисточник.
Вы можете привести RFC, где описывается «нотация» IP-адреса? Интересно все-таки увидеть первоисточник.
Линукс является ядром ОС и имеет очень отдаленное отношение к проблеме. Прикладная программа ping — это тоже о другом. Разные прикладные программы могут позволять представлять IP-адрес в самых разных формах, хоть словами. Речь не об IP-адресах вообще. Я об стандартной универсальной вещи, используемой множеством прикладных программ — об URI (или URL, разница тут не важна). А вот в URL-то IP-адрес можно указывать не как заблагорассудится, или как позволяет программа ping в конкретно вашем Линуксе, а только определенным образом, который и стандартизирован в RFC3986. Uniform Resource Identifier (URI): Generic Syntax
Процитирую нужные кусочки (выделение жирным — моё):
Процитирую нужные кусочки (выделение жирным — моё):
A host identified by an IPv4 literal address is represented in
dotted-decimal notation (a sequence of four decimal numbers in the
range 0 to 255, separated by "."), as described in [RFC1123] by
reference to [RFC0952]. Note that other forms of dotted notation may
be interpreted on some platforms, as described in Section 7.4, but
only the dotted-decimal form of four octets is allowed by this
grammar.
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
dec-octet = DIGIT; 0-9
/ %x31-39 DIGIT; 10-99
/ «1» 2DIGIT; 100-199
/ «2» %x30-34 DIGIT; 200-249
/ «25» %x30-35; 250-255
На связке Mac Os + Safari числовое представление адреса не работает
Господа, а зачем карете турбина? IP четвертой версии уже потихоньку уходит в прошлое.
ping 0xBabaBeda
ничего личного :)
ничего личного :)
я никого не испугаю, если скажу что RGB(255, 127, 0) можно записать в виде ff7f00 или 16744192?
Sign up to leave a comment.
Альтернативный способ записи IP-адресов