在 R 中将 IP 地址 (IPv4) 转换为整数

use*_*691 4 mysql ip r ip-address bit

我正在寻找一种在 R 中编写将 IP 地址转换为整数的函数的方法。

我的数据框如下所示:

total  IP
626    189.14.153.147
510    67.201.11.8
509    64.22.53.140
483    180.9.85.10
403    98.8.136.126
391    64.06.187.68
Run Code Online (Sandbox Code Playgroud)

我从mysql数据库导出这些数据。我有一个查询,可以在 mysql 中将 IP 地址转换为整数:

mysql> select CAST(SUBSTRING_INDEX(SUBSTRING_INDEX('75.19.168.155', '.', 1), '.', -1) << 24 AS UNSIGNED) + CAST(SUBSTRING_INDEX(SUBSTRING_INDEX('75.19.168.155', '.', 2), '.', -1) << 16 AS UNSIGNED) + CAST(SUBSTRING_INDEX(SUBSTRING_INDEX('75.19.168.155', '.', 3), '.', -1) << 8 AS UNSIGNED) + CAST(SUBSTRING_INDEX(SUBSTRING_INDEX('75.19.168.155', '.', 4), '.', -1) AS UNSIGNED) FINAL;
Run Code Online (Sandbox Code Playgroud)

但我想在 R 中进行此转换,任何帮助都会很棒

42-*_*42- 6

您并不完全具体说明您想要什么转换,因此我将十进制值乘以我认为可能合适的值(认为三位数字项目实际上是“基数 256”数字中的数字等价物,然后以基数 10 重新显示)。如果您希望反转位置的顺序,正如我在其他地方看到的那样,您可以反转两个解决方案中“vals”的索引

 convIP <- function(IP) { vals <- read.table(text=as.character(IP), sep=".")
               return( vals[1] + 256*vals[2] + 256^2*vals[3] + 256^3*vals[4]) }

> convIP(dat$IP)
          V1
1 2476281533
2  134990147
3 2352289344
4  173345204
5 2122844258
6 1153107520
Run Code Online (Sandbox Code Playgroud)

(通常更好的 IT 实践是指定您认为正确的答案,以便进行测试。Bertelson 上面的评论会更快,并且隐式使用 1000、1000^2 和 1000^3 作为因子。)

我正在尝试简化代码,但担心使用的需要Reduce("+", ...)可能会使代码变得更加复杂。您无法使用,sum因为它没有矢量化。

 convIP <- function(IP) { vals <- read.table(text=as.character(IP), sep=".")
                return( Reduce("+", vals*256^(3:0))) }

> convIP(dat$IP)
[1] 5737849088    5112017 2717938944    1245449 3925902848   16449610
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,这正是我想要的,我为不清楚而道歉。本质上,这是我的主要目标 convIP &lt;- function(IP) { vals &lt;- read.table(text=as.character(IP), sep=".") + return( 256^3*vals[1] + 256^ 2*vals[2] + 256*vals[3] + vals[4]) } (2认同)