![如何将十六进制值转换为“标准” IP 地址?](https://linux22.com/image/1500946/%E5%A6%82%E4%BD%95%E5%B0%86%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E5%80%BC%E8%BD%AC%E6%8D%A2%E4%B8%BA%E2%80%9C%E6%A0%87%E5%87%86%E2%80%9D%20IP%20%E5%9C%B0%E5%9D%80%EF%BC%9F.png)
如何在没有在线转换器的情况下手动将十六进制值转换为 IP 地址?
例如,在正常 IP 点表示法中 80D00297 是什么?
答案1
使用 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
,它返回句点.
。这样,数字之间用句点分隔,但最后一个数字后面跟着换行符。
答案2
假设你的意思是将其转换为字符串或点分符号表示
首先你需要知道的是地址是网络字节顺序还是主机字节顺序。网络字节顺序是大端序,而基于英特尔的计算机是小端序。你可以使用名为 ntohl 的函数将两者相互转换,该函数基本上从地址中取出每个字节(2 个十六进制字符),然后将其反转,因此 80d00297 将变成 9702d080
然后取出每个字节,并将其转换为十进制。您可以使用计算器来完成此操作。
80 => 128
d0 => 208
02 => 2
97 => 151
因此,如果该地址按主机字节顺序排列,则地址为 128.208.2.151
答案3
您可以使用ctf 派对(免责声明:我是作者)
require 'ctf_party'
'80D00297'.from_hexip # => "128.208.2.151"
'80D00297'.from_hexip(nibble: :low) # => "151.2.208.128"
在 Unix 上,某些文件/proc/net/tcp
使用低半字节优先(小端字节序)。