从R中的IP地址中查找IP_range详细信息

时间:2014-12-01 07:18:51

标签: r ip

我有两张桌子。表A包含' ip_address'字段和其他表格B包含' ip_start'和' ip_end' (ip的范围)以及其他字段。我想从表B中提取ip_address的详细信息。

例如。表A有

ip_address : '178.91.21.2" 

表B

1. ip_start :  "178.91.19.0" and ip_end : "178.91.19.255"
2. ip_start :  "178.91.21.0" and ip_end : "178.91.21.255"

现在我的查询应该返回表B中与记录2相关的详细信息。

我想在R中实现这一点。任何人都可以建议如何做到这一点?

1 个答案:

答案 0 :(得分:4)

这是一种方式。您指定的ipv4地址基本上是8字节十六进制的十进制表示,因此只需通过如下转换即可将它们表示为十进制整数。

  

a.b.c.d = a×256 3 + b×256 2 + c×256 + d

因此我们对测试向量(本例中为ip)和范围数据帧(本例中为ip.range)执行此操作,然后使用简单算法确定哪个范围与哪个ip匹配

# example dataset
ip       <- c("178.91.21.2","178.91.19.30","178.91.20.100")
ip.range <- data.frame(start=c("178.91.19.0",  "178.91.20.0",  "178.91.21.0"),
                       end=  c("178.91.19.255","178.91.20.255","178.91.21.255"),
                       stringsAsFactors=FALSE)
# function to convert ip address to decimal integer
ip2integer <- function(ip) sapply(strsplit(ip,".",fixed=TRUE),function(x)sum(as.integer(x)*256^(3:0)))
# convert ip and ranges to integer
ip.int    <- ip2integer(ip)
range.int <- data.frame(sapply(ip.range,ip2integer))
# find indices, combine into result
indx   <- sapply(ip.int,function(x)with(range.int,which(x>=start & x <=end)))
result <- cbind(ip,ip.range[indx,])
result
#              ip       start           end
# 3   178.91.21.2 178.91.21.0 178.91.21.255
# 1  178.91.19.30 178.91.19.0 178.91.19.255
# 2 178.91.20.100 178.91.20.0 178.91.20.255