如何将 IPv6 地址转换为二进制表示并返回?
我只能将其转换为数字,然后尝试将其转换为字符串。
IPAddr.new('fe80::c')
# => #<IPAddr: IPv6:fe80:0000:0000:0000:0000:0000:0000:000c/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>
IPAddr.new('fe80::c').to_i
# => 338288524927261089654018896841347694604
正如@tadman 指出的那样,将其作为数字处理是没有意义的。将其转换为二进制是理想的。
从IPv6 转换为字节:
IPAddr.new('fe80::c').hton
# => "\xFE\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\f"
从字节转换为 IPv6:
IPAddr::new_ntoh(_)
# => #<IPAddr: IPv6:fe80:0000:0000:0000:0000:0000:0000:000c/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>
我敢肯定,这不是最优雅的解决方案,但似乎对我有用:
my_ip = IPAddr.new('fe80::c').to_i.to_s(16)
这将为您提供一个字符串,其中包含十六进制形式的完整扩展 IPv6 地址。
然后可以使用以下函数将十六进制字符串转换为二进制:
def hex_to_bin(s_h) # convert readable hex to binary
s_h.scan(/../).map { |z| z.hex.chr }.join
end