如何将十六进制值转换为“标准” IP 地址?

如何将十六进制值转换为“标准” IP 地址?

如何在没有在线转换器的情况下手动将十六进制值转换为 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使用低半字节优先(小端字节序)。

相关内容