Pull to refresh

Comments 131

Интересный способ, не знал о таком
Честно говоря, я вот уже 10 минут пытаюсь вспомнить, _откуда_ я знаю об этом. Так и не вспомнил :-(

В студенческие годы только это знание помогло наконец понять, почему не проходит коннект на айпи 192.168.070.31. Человек набрал 070 потому, что тогда не надо точку давить — программка сама перекидывает фокус на следующий октет. И мучался два дня, ничего не понимая :-)
MAC тоже можно поразному записывать :) когда я только начинал знакомиться с cisco очень удивляла надпись вида хххх.хххх.хххх
Это тупо расстанка «знаков препинания», так сказать.
Чего действительно в цисках другое забавное, так это поддежка обратной записи айпи, 1.0.0.127, к примеру.
Когда-то ооооочень давно была страничка в интернете на английском, посвящённая маскировке УРЛа, и там было написано много способов — и такой как www.list.ru@1297618184, и такие, как Вы описали… Я потом искал эту страничку — не нашёл. Возможно, эта информация у Вас оттуда же в голове отложилась и вот всплыла.
да, вот я тоже об этом сразу вспомнил
и даже какая-то программа была, которая маскировала и демаскировала такие урлы
А я случайно узнал что такое longip.
Когда потребовалось написать механизм, на проверку вхождения в заданный диапазон.
Потом заменил на стандартную функцию ip2long()
На вскидку думаю так — это связанно с особенностью современной архитектуры, точнее ее 32-разрядностью.
32 бита = 4 байта = 1 двойное слово
В АйПи используется как раз 4 байта, которые хранятся в памяти в виде одного двойного слова
По моему так (с) Винни пух
о_о
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
вот так ( с http:// работает):
011526012410/
UFO just landed and posted this here
Хром сразу в нормальный айпи конвертирует.
UFO just landed and posted this here
огнелис оставил без изменения, а то что у вас получилось — редирект.
UFO just landed and posted this here
UFO just landed and posted this here
Safari can’t open the page “http://1249723236/” because Safari can’t find the server “1249723236”.

Сафари 4.0.3 на Снежном Леопарде…

Терминал пигует нормально предварительно сконвертировав в стандартный айпи.
В PHP есть даже встроенные функции для этого:
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.
Функция ip2long грешит.
Если возвращенное значение из функции более максимального значения целого числа: 32 бита (2147483647) или 64 бита, то производится пересчет значения в число с плавающей точкой.
Поэтому, на разных платформах, функция может выдать разные значения. будьте осторожны.
Интересно, как из 4 байт может получиться число более 32 байт?
Дружок, на всякий случай, чтобы ты знал: числа бывают знаковые и беззнаковые. про 64 бита — гон.
видимо, этот способ записи не везде поддерживается
в FTP-клиенте и браузере замечательно работает
у меня второй сквид сработал нормально. а третий в комментах выше не справился.
Полезное применение такой нотации — хранение IP-адресов в базе данных.
В строковом виде IP занимает 7-15 байт, в числовом — 4 байта.
В той же MySQL реализовано, INET_ATON() и INET_NTOA().
UFO just landed and posted this here
В mysql ещё нет.
В PHP можно использовать inet_pton();
Больше полезно для проверки входждения в диапазон адресов :)
А ещё для сортировки очень здорово, да.
А почему?
62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
62 * 2563 + 149 * 2562 + 62 * 2561 = 1049968128
UFO just landed and posted this here
UFO just landed and posted this here
Вы написали для случая 62.149.0.62. У меня записано то же самое. А вот для 62.149.62 я действительно ошибся. ТО, что записано у меня во второй строке — это для 62.149.62.0
А для 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
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 нужно умножить на 1, а не на 256?
UFO just landed and posted this here
марш в школу на информатику, изучать способы перевода из одной системы счисления в другую

если в школу уже поздно. то хотя бы в гугл или википедию
UFO just landed and posted this here
ru.wikipedia.org/wiki/Шестнадцатеричная_система_счисления

топик стартер как-то туманно обяснил процесс перевода стандартного 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.255= 62.149.0.255 (сорри, ctrl случайно нажала)
и может где-то не так перевела из 16-ричной в 10-чную. перевожу на бегу )
потому, что 62.149.0.62 = 62.149.62, 62.62 = 62.0.0.62, 127.1 = 127.0.0.1
в IP адресе 0 можно опускать, когда придет IPV6 это прочувствуется острее.
Вот ведь твердолобый :)
Спрашивают «почему», ответ опять «потому что равно». Ну да ладно, trisch вроде все объяснила.
Либо у меня дежавю, либо это уже недавно было на хабре
Классический пример применения union в языке C и аналогичных конструкций языка ;-)
union в языке C — такая конструкция, в которую можно записать массив из четырёх байтов, а прочитать 32х-битное целое, которое будет состоять как раз из тех самых байтов.
Неужели? А то что на LE и BE значения будут разные роли не играет?
Вам никто не сказал что endiannes сохранится. Это именно способ доступа к памяти, а не преобразование. Часто еще применялось для доступа к отдельным битам флагов, типа такого:

union {
dword dwFlags;
struct {
bool bit1: 1;
bool bit2: 1;
bool bit3: 1;
bool bit4: 1;
// etc
}
}

тогда можно писать в отдельный бит, а читать из всего слова. ну или наоборот, одним махом присвоить/прочитать все значения.
пардон, парсер схавал отступы :(
> Вам никто не сказал что endiannes сохранится.
И какое тогда union имеет отношение к теме топика?
К тому что надо читать всю ветку комментариев, а не только последние два. Ибо весь сабж суть разные формы представления одного и того же dword-а.
я уже сталкивался с этим, когда писал под виндус приложение на c++ для работы с роутами с использованием библиотеки iphlpapi. там как раз при возвращении таблицы роутов все ip адреса dword'овские, а не как я надеялся получать ip в виде структуры
Чесно говоря, до последнего предложения казалось, что топик полная фигня. Но вот прикладная часть в корне меняет дело!
UFO just landed and posted this here
Здорово.

Интересна обратная процедура — есть, например, номер телефона (вместе с кодом города — как раз) — и получить такой же IP-адрес :-)

Получается unified messaging в чистом виде.
Только вот айпи-адреса по одному не продаются, так что это дело очень большого везения (или больших денег), заиметь такой адрес.
Куда проще достать номер аськи.
Для телефонов есть e164.arpa., хотя он не так известен, как in-addr.arpa. и вряд ли широко делегируется.
UFO just landed and posted this here
«8 * 256О» — oO, это шо?
или для наглядности?
Это «восемь умножить на двести пятьдесят шесть в нулевой степени».
это восемь. просто восемь.
я как-то сталкивался с айпи адресами в виде числа, если не изменяет память, то это было в ULOG в linux`e…
наверное полезно было бы в пост добавить алгоритм для обратного преобразования в традиционный вид.
>алгоритм для обратного преобразования в традиционный вид

calc.exe

из десятичного в hex, и оттуда по байтово снова в dec
В детстве читал про это в Хакере, даже фраза была похожая: «можно записать так… так..., или даже смешивать»
Ага, я тоже оттуда подчерпнул
> В детстве читал про это в Хакере
Вот так незаметно и подступила ко мне старость
Да, тоже вспомнил. Имха, 98 год, ещё бумажное издание.
А также 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.
это ужасно.
пора эволюционировать в роботов
Скоро придёт IPv6 и всё, никаких вам украшений адресов.
Впрочем, он уже пришёл — Freenet6 же! Я даже пробовал.
UFO just landed and posted this here
О да! Я сразу не вспомнил, но это же прекрасно!
Интересно то, что хром в статье все ссылки позаменял на классический формат.
UFO just landed and posted this here
Увы)
1000000000 — 59.154.202.0 — Australia
222222222 — 13.62.215.142 — United States
АААААА 0.10.44.42— демонический айпишник…
Это работает не везде. Не в любом браузере, не в любой OS.
А яндекс не боится хабраэффекта?
Если даже хабр не боится хабраэффекта, то думаю яндексу на него вообще наплевать (:
Пинговать надо только раз в 108 минут
жалко, что никто не написал, откуда этот трюк взялся
я 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: — нет.
Линукс тогда получается тоже идет поперек стандарта: ping 1297618184 и lynx 1297618184 работают на ура.
Вы можете привести 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 числовое представление адреса не работает
А всем говорят — Think different… ;)
ненене, никаких холиваров :) смысл этого выражения в другом :)
Там скоро и адресная строка не будет работать, ибо правоверный мак-юзер не должен набирать адрес с клавиатуры, это для варварских линуксоидов и виндузятников.
Ну да. Внедрят, предположим, голосовой ввод, и будут полчища юзеров усердно пытаться спеллить [haebrahaebr], а в ответ им Four-Zero-Four:))
Господа, а зачем карете турбина? IP четвертой версии уже потихоньку уходит в прошлое.
Ну вот и обращайся к гуглу (и большинству сайтов) по 6. Наверняка его тоже можно сократить до натурального числа, только в 2 раза длиннее.
я никого не испугаю, если скажу что RGB(255, 127, 0) можно записать в виде ff7f00 или 16744192?
16744192 что-то не очень работает у меня в CSS
приведите пример
я где-то упомянул CSS?
rgb(x, y, z) — в CSS есть такая конструкция, вот я и подумал
то, что можно цвет записать числом — это замечательно, но способ записи IP, который тут описан очень много где работает
Sign up to leave a comment.

Articles

Change theme settings