Альтернативный способ записи IP-адресов

    Наверное, некоторые знают такую штуку, но думаю, далеко не все.

    Как мы все знаем, адрес IPv4 представляет собой 32-битное число. Традиционно IP-адрес записывается в виде 4-х октетов, разделенных точкой, в десятичной системе счисления. Например: 77.88.21.8.
    Однако существуют и другие, менее распространенные варианты записи.

    Во-первых, каждый из 4-х октетов можно записать в восьмеричной или шестнадцатеричной системах счисления:
    77.88.21.8 = 0x4d.0x58.0x15.0x8 = 0115.0130.025.010, или даже можно смешивать 77.88.0x15.010.

    Во-вторых, адрес можно записывать в виде числа:
    77 * 2563 + 88 * 2562 + 21 * 2561 + 8 * 256О = 1297618184.
    Аналогично п.1 это число можно записывать в восьмеричной и шестнадцатеричной системах счисления: 1297618184 = 011526012410 = 0x4D581508.

    Честно говоря, не нашел RFC, в котором описываются эти форматы, но это работает везде: в браузере, команде ping и т.д. Попробуйте сами.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

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

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

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

                              Терминал пигует нормально предварительно сконвертировав в стандартный айпи.
                            • +3
                              В PHP есть даже встроенные функции для этого:
                              php.net/ip2long
                              php.net/long2ip

                              Там же, в мануале, ссылка на реализацию этого же в стандартной библиотеке С. Наверное из C оно и попало в ОС, браузеры и т.п.
                              • 0
                                Должен заметить, что там довольно странная реализация. Функция может легко давать отрицательные значения.
                                • +1
                                  Да, в мануале написано:

                                  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.
                                  • 0
                                    Функция ip2long грешит.
                                    Если возвращенное значение из функции более максимального значения целого числа: 32 бита (2147483647) или 64 бита, то производится пересчет значения в число с плавающей точкой.
                                    Поэтому, на разных платформах, функция может выдать разные значения. будьте осторожны.
                                    • 0
                                      Интересно, как из 4 байт может получиться число более 32 байт?
                                      • 0
                                        Дружок, на всякий случай, чтобы ты знал: числа бывают знаковые и беззнаковые. про 64 бита — гон.
                                  • +2
                                    squid только об этом не знает.
                                    • +3
                                      и nginx говорит Bad Request
                                      • –1
                                        видимо, этот способ записи не везде поддерживается
                                        в FTP-клиенте и браузере замечательно работает
                                      • 0
                                        у меня второй сквид сработал нормально. а третий в комментах выше не справился.
                                      • +5
                                        Полезное применение такой нотации — хранение IP-адресов в базе данных.
                                        В строковом виде IP занимает 7-15 байт, в числовом — 4 байта.
                                        • +5
                                          В той же MySQL реализовано, INET_ATON() и INET_NTOA().
                                          • 0
                                            интересно, для IP6 такое в mysql уже есть?
                                            • 0
                                              В mysql ещё нет.
                                              В PHP можно использовать inet_pton();
                                          • +1
                                            Больше полезно для проверки входждения в диапазон адресов :)
                                            • 0
                                              А ещё для сортировки очень здорово, да.
                                          • –1
                                            Ну и как следствие отсюда 62.149.0.62 = 62.149.62
                                            • 0
                                              А почему?
                                              62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
                                              62 * 2563 + 149 * 2562 + 62 * 2561 = 1049968128
                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                  • 0
                                                    Вы написали для случая 62.149.0.62. У меня записано то же самое. А вот для 62.149.62 я действительно ошибся. ТО, что записано у меня во второй строке — это для 62.149.62.0
                                                    А для 62.149.62 будет: 62 * 2562 + 149 * 2561 + 62 * 256o = 4101438. Т.е. вс равно не равно :-)
                                                    • 0
                                                      А почему так считать? Почему не 62 * 2563 + 149 * 2561 + 62 * 256?
                                                      • +3
                                                        Я не прав…
                                                        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прав :)
                                                    • –3
                                                      потому что
                                                      62 * 2563 + 149 * 2562 + 0 * 2561 + 62 * 256O = 1049952318
                                                      62 * 2563 + 149 * 2562 + 62 * 256O = 1049952318
                                                      • 0
                                                        см. выше.
                                                        • +2
                                                          Как вы узнали, что 62 нужно умножить на 1, а не на 256?
                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                            • –6
                                                              марш в школу на информатику, изучать способы перевода из одной системы счисления в другую

                                                              если в школу уже поздно. то хотя бы в гугл или википедию
                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                • –5
                                                                  ru.wikipedia.org/wiki/Шестнадцатеричная_система_счисления

                                                                  топик стартер как-то туманно обяснил процесс перевода стандартного ip адреса в целое десятичное число, хотя на само деле процесс прост

                                                                  каждый байт ip адреса переводится в шестнадцатиричную систему, затем все байты записываются в одно число в том же порядке как они стоя в ip адресе, и хатем это числу переводится в десятичную систему

                                                                  123.234.34.45 = 0x7B.0xEA.0x22.0x2D = 0x7BEA222D = 2078941741
                                                                  • 0
                                                                    Да в том то и дело, что когда PHP посчитает ip2long('62.149.62') и ip2long('62.149.0.62'), то выдаст одинаковые результаты, как и С, впрочем. Всё это из-за реализации понятия «non-complete IP», насколько я понял. Т.е. IP с тремя октетами этой библиотекой считаются валидными и переводятся по другим правилам (не «дополняя» нулём спереди или сзади.
                                                                • 0
                                                                  Это не имеет ничего общего со способами перевода информации, 62.149.0.62 ≠ 62.149.62 при переводе поразрядно, они равны только как ip адреса, но вот почему — не понятно.
                                                                  • 0
                                                                    И снова см. выше :) Это сточки из мануала к C-шной библиотеке, на её основе PHP-шная написана
                                                                    • +2
                                                                      Т.е. это не имеет никакого логического объяснения, просто так реализовано в самой популярной библиотеке?
                                                                      • +1
                                                                        логическое объяснение в том, что адрес имеет фиксированную длину, и если он у вас в формате 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
                                                                        • 0
                                                                          62.149.255= 62.149.0.255 (сорри, ctrl случайно нажала)
                                                                          и может где-то не так перевела из 16-ричной в 10-чную. перевожу на бегу )
                                                                • –1
                                                                  потому, что 62.149.0.62 = 62.149.62, 62.62 = 62.0.0.62, 127.1 = 127.0.0.1
                                                                  в IP адресе 0 можно опускать, когда придет IPV6 это прочувствуется острее.
                                                                  • 0
                                                                    Вот ведь твердолобый :)
                                                                    Спрашивают «почему», ответ опять «потому что равно». Ну да ладно, trisch вроде все объяснила.
                                                        • –5
                                                          Либо у меня дежавю, либо это уже недавно было на хабре
                                                          • –1
                                                            Классический пример применения union в языке C и аналогичных конструкций языка ;-)
                                                            • +1
                                                              o_O Вы о чём?
                                                              • +3
                                                                union в языке C — такая конструкция, в которую можно записать массив из четырёх байтов, а прочитать 32х-битное целое, которое будет состоять как раз из тех самых байтов.
                                                                • –1
                                                                  Неужели? А то что на LE и BE значения будут разные роли не играет?
                                                                  • +2
                                                                    Вам никто не сказал что endiannes сохранится. Это именно способ доступа к памяти, а не преобразование. Часто еще применялось для доступа к отдельным битам флагов, типа такого:

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

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

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

                                                                      Получается unified messaging в чистом виде.
                                                                      • 0
                                                                        Только вот айпи-адреса по одному не продаются, так что это дело очень большого везения (или больших денег), заиметь такой адрес.
                                                                        Куда проще достать номер аськи.
                                                                        • +1
                                                                          Для телефонов есть e164.arpa., хотя он не так известен, как in-addr.arpa. и вряд ли широко делегируется.
                                                                        • –3
                                                                          зачот
                                                                          • +1
                                                                            ping 2130706433

                                                                            Обмен пакетами с 127.0.0.1 по 32 байт:

                                                                            Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128

                                                                            И правда работает :)
                                                                          • –7
                                                                            «8 * 256О» — oO, это шо?
                                                                            или для наглядности?
                                                                            • 0
                                                                              Это «восемь умножить на двести пятьдесят шесть в нулевой степени».
                                                                              • +1
                                                                                это восемь. просто восемь.
                                                                              • +3
                                                                                точно, для наглядности
                                                                              • 0
                                                                                я как-то сталкивался с айпи адресами в виде числа, если не изменяет память, то это было в ULOG в linux`e…
                                                                                наверное полезно было бы в пост добавить алгоритм для обратного преобразования в традиционный вид.
                                                                                • 0
                                                                                  >алгоритм для обратного преобразования в традиционный вид

                                                                                  calc.exe

                                                                                  из десятичного в hex, и оттуда по байтово снова в dec
                                                                                • 0
                                                                                  В детстве читал про это в Хакере, даже фраза была похожая: «можно записать так… так..., или даже смешивать»
                                                                                  • 0
                                                                                    Ага, я тоже оттуда подчерпнул
                                                                                    • +1
                                                                                      > В детстве читал про это в Хакере
                                                                                      Вот так незаметно и подступила ко мне старость
                                                                                      • 0
                                                                                        Да, тоже вспомнил. Имха, 98 год, ещё бумажное издание.
                                                                                      • +1
                                                                                        • +1
                                                                                          А также 9644112386 и так далее…
                                                                                          Что в первый раз с переполнением сталкиваетесь?
                                                                                        • +1
                                                                                          Не забывайте ещё про htonl/ntohl преобразования, ибо есть «сетевой» порядок байт, описанный в RFC, а есть машинный, зависящий от ОС и железа.
                                                                                          Иногда байты надо переворачивать…
                                                                                          • 0
                                                                                            баловалка на вечер=)
                                                                                            • 0
                                                                                              Недавно проскакивало в комментариях к какому-то посту.
                                                                                              • +5
                                                                                                Капитан Очевидность припас ещё один способ записи 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.
                                                                                                • +1
                                                                                                  это ужасно.
                                                                                                  пора эволюционировать в роботов
                                                                                                • +1
                                                                                                  Скоро придёт IPv6 и всё, никаких вам украшений адресов.
                                                                                                  Впрочем, он уже пришёл — Freenet6 же! Я даже пробовал.
                                                                                                • 0
                                                                                                  Интересно то, что хром в статье все ссылки позаменял на классический формат.
                                                                                                • +2
                                                                                                  Могла бы быть гонка за красивым числом)
                                                                                                  К примеру 1000000000 или 222222222
                                                                                                  • 0
                                                                                                    хочу такой =)
                                                                                                    • +1
                                                                                                      Увы)
                                                                                                      1000000000 — 59.154.202.0 — Australia
                                                                                                      222222222 — 13.62.215.142 — United States
                                                                                                  • 0
                                                                                                    АААААА 0.10.44.42— демонический айпишник…
                                                                                                    • +1
                                                                                                      Это работает не везде. Не в любом браузере, не в любой OS.
                                                                                                      • –2
                                                                                                        А яндекс не боится хабраэффекта?
                                                                                                        • +2
                                                                                                          Если даже хабр не боится хабраэффекта, то думаю яндексу на него вообще наплевать (:
                                                                                                        • +2
                                                                                                          4815162342 опасно пинговать О_о
                                                                                                          • +1
                                                                                                            Пинговать надо только раз в 108 минут
                                                                                                          • 0
                                                                                                            жалко, что никто не написал, откуда этот трюк взялся
                                                                                                            я RFC полистал, но не нашел ничего такого
                                                                                                            • 0
                                                                                                              В том-то и дело, что этот способ является вредным нарушением стандартов, описанных в 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: — нет.
                                                                                                              • 0
                                                                                                                Линукс тогда получается тоже идет поперек стандарта: ping 1297618184 и lynx 1297618184 работают на ура.
                                                                                                                Вы можете привести RFC, где описывается «нотация» IP-адреса? Интересно все-таки увидеть первоисточник.
                                                                                                                • +1
                                                                                                                  Линукс является ядром ОС и имеет очень отдаленное отношение к проблеме. Прикладная программа 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
                                                                                                                  • 0
                                                                                                                    спасибо, теперь все понятно
                                                                                                            • +1
                                                                                                              На связке Mac Os + Safari числовое представление адреса не работает
                                                                                                              • 0
                                                                                                                А всем говорят — Think different… ;)
                                                                                                                • 0
                                                                                                                  ненене, никаких холиваров :) смысл этого выражения в другом :)
                                                                                                                • +2
                                                                                                                  Там скоро и адресная строка не будет работать, ибо правоверный мак-юзер не должен набирать адрес с клавиатуры, это для варварских линуксоидов и виндузятников.
                                                                                                                  • 0
                                                                                                                    скорей бы уж )))
                                                                                                                    • +1
                                                                                                                      Ну да. Внедрят, предположим, голосовой ввод, и будут полчища юзеров усердно пытаться спеллить [haebrahaebr], а в ответ им Four-Zero-Four:))
                                                                                                                • +1
                                                                                                                  Господа, а зачем карете турбина? IP четвертой версии уже потихоньку уходит в прошлое.
                                                                                                                  • 0
                                                                                                                    Ну вот и обращайся к гуглу (и большинству сайтов) по 6. Наверняка его тоже можно сократить до натурального числа, только в 2 раза длиннее.
                                                                                                                  • +1
                                                                                                                    ping 0xBabaBeda
                                                                                                                    ничего личного :)
                                                                                                                    • 0
                                                                                                                      я никого не испугаю, если скажу что RGB(255, 127, 0) можно записать в виде ff7f00 или 16744192?
                                                                                                                      • 0
                                                                                                                        16744192 что-то не очень работает у меня в CSS
                                                                                                                        приведите пример
                                                                                                                        • 0
                                                                                                                          я где-то упомянул CSS?
                                                                                                                          • 0
                                                                                                                            rgb(x, y, z) — в CSS есть такая конструкция, вот я и подумал
                                                                                                                            то, что можно цвет записать числом — это замечательно, но способ записи IP, который тут описан очень много где работает

                                                                                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.