1

Как вручную преобразовать шестнадцатеричное значение в IP-адрес без онлайн-конвертера?

Например, что такое 80D00297 в обычной записи IP точек?

2 ответа2

3

Использование sed и bash

$ printf '%d.%d.%d.%d\n' $(echo 80D00297 | sed 's/../0x& /g')
128.208.2.151

Как это устроено:

  • sed используется для переформатирования числа:

    $ echo 80D00297 | sed 's/../0x& /g'
    0x80 0xD0 0x02 0x97 
    
  • Формат %d в printf используется для преобразования шестнадцатеричных чисел в десятичные.

Использование GNU awk

$ echo 80D00297 | gawk --non-decimal-data '{for (i=1;i<=NF;i++) printf "%d%s","0x"$i,(i==NF?"\n":".")}' FPAT='..' 
128.208.2.151

При этом используется FPAT='..' для разделения ввода на два символьных поля. Затем мы перебираем каждое поле, ставим перед ним 0x и передаем его в printf в формате %d , чтобы шестнадцатеричное число было преобразовано в десятичное.

Кажущейся сложной частью вышесказанного является троичное утверждение (i==NF?"\n":".") . Этот оператор возвращает символ новой строки, если мы находимся в последнем поле, i==NF . Для других значений i возвращает период . , Таким образом, числа разделяются точкой, но за последним номером следует символ новой строки.

1

Предполагая, что вы имеете в виду преобразовать его в строковое или точечное представление

Первое, что вам нужно знать, это адрес в сетевом порядке или в байтовом порядке. Сетевой порядок байтов имеет порядок байтов, тогда как компьютеры на базе Intel имеют порядок байтов. Вы можете преобразовать один в другой, используя функцию ntohl, которая в основном берет каждый байт (2 шестнадцатеричных символа) из адреса и переворачивает их, поэтому 80d00297 станет 9702d080

Затем вы берете каждый байт и конвертируете в десятичную. Вы можете использовать калькулятор для этого.

80 => 128
d0 => 208
02 => 2
97 => 151

поэтому, если этот адрес в порядке байтов хоста, адрес 128.208.2.151

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .