Как вручную преобразовать шестнадцатеричное значение в IP-адрес без онлайн-конвертера?
Например, что такое 80D00297 в обычной записи IP точек?
Как вручную преобразовать шестнадцатеричное значение в IP-адрес без онлайн-конвертера?
Например, что такое 80D00297 в обычной записи IP точек?
$ 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
используется для преобразования шестнадцатеричных чисел в десятичные.
$ 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
возвращает период .
, Таким образом, числа разделяются точкой, но за последним номером следует символ новой строки.
Предполагая, что вы имеете в виду преобразовать его в строковое или точечное представление
Первое, что вам нужно знать, это адрес в сетевом порядке или в байтовом порядке. Сетевой порядок байтов имеет порядок байтов, тогда как компьютеры на базе Intel имеют порядок байтов. Вы можете преобразовать один в другой, используя функцию ntohl, которая в основном берет каждый байт (2 шестнадцатеричных символа) из адреса и переворачивает их, поэтому 80d00297 станет 9702d080
Затем вы берете каждый байт и конвертируете в десятичную. Вы можете использовать калькулятор для этого.
80 => 128
d0 => 208
02 => 2
97 => 151
поэтому, если этот адрес в порядке байтов хоста, адрес 128.208.2.151