Ruby:如何将 IP 地址从十六进制字符串转换为人类可读的?

标签 ruby

找不到它,如果重复请提前道歉。

我想转换地址,例如,

0000000000000000FFFF00000B79290A

转换成人类可读的形式。注意,虽然是 IPv6,但实际上是嵌入了 IPv4 地址,因此最好将其转换为:

10.41.121.11

我从/proc/net/tcp读取了这种类型的地址,并且想解析它。

谢谢。

最佳答案

Ruby 附带了 IPAddr 类,它可以将 IPv4 和 IPv6 字符串解析为对象。还有NetAddr这是非常强大的。尽可能使用预先发明的轮子,因为它们经过了充分测试并包含有用的方法:

require 'ipaddr'
IPAddr.new "[#{'0000000000000000FFFF00000B79290A'.scan(/.{4}/).join(':')}]"
#<IPAddr: IPv6:0000:0000:0000:0000:ffff:0000:0b79:290a/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>

有必要将字符串转换为冒号分隔的字段,并将其包装在 [...] 中,告诉 IPAddr 将其视为 IPv6 地址:

'0000000000000000FFFF00000B79290A'.scan(/.{4}/)
=> [
    [0] "0000",
    [1] "0000",
    [2] "0000",
    [3] "0000",
    [4] "FFFF",
    [5] "0000",
    [6] "0B79",
    [7] "290A"
]

'0000000000000000FFFF00000B79290A'.scan(/.{4}/).join(':')
=> "0000:0000:0000:0000:FFFF:0000:0B79:290A"

使用网络地址:

NetAddr::CIDR.create('0000000000000000FFFF00000B79290A'.scan(/.{4}/).join(':'))
=> #<NetAddr::CIDRv6:0x007fd4971c34f0 @ip=18446462598925330698, @version=6, @address_len=128, @all_f=340282366920938463463374607431768211455, @netmask=340282366920938463463374607431768211455, @network=18446462598925330698, @hostmask=0, @tag={}, @wildcard_mask=340282366920938463463374607431768211455>

关于Ruby:如何将 IP 地址从十六进制字符串转换为人类可读的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080128/

相关文章:

ruby-on-rails - 从 4.1.1 降级到 rails 3.2.18

ruby-on-rails - 使用 rspec 将日期时间字段测试为 JSON 字符串

Ruby 1.9.1 加载路径疯狂

ruby-on-rails - 我如何使用路由别名改进重定向

ruby - 在 Padrino 上模拟 current_account 以进行 rspec 测试

ruby-on-rails - 是否有一种优雅的单行代码可以使用 .send() 附加存储在数组中的范围?

ruby-on-rails - 如何在 Ruby on Rails 中读取基于编码的 CSV

jquery - Rails 3.1 authenticity_token + uploadify

ruby - 为什么 `Enumerable` 有 `first` 而不是 `last` ?

ruby - 由于 ruby​​-lang.org 布局更改(或永久性故障?),rbenv 安装失败