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

Posted

技术标签:

【中文标题】将IP地址(IPv4)转换为R中的整数【英文标题】:Convert IP address (IPv4) itno an Integer in R 【发布时间】:2014-03-03 19:49:18 【问题描述】:

我正在寻找一种在 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

我从 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;

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

【问题讨论】:

为什么不使用 INET6_ATON() / INET_ATON() 然后只使用原始整数? 【参考方案1】:

您并没有完全具体说明您想要什么转换,所以我将十进制值乘以我认为可能合适的值(认为这三个数字项实际上是“以 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

(指定您认为正确的答案通常是更好的 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

【讨论】:

非常感谢,这正是我想要的,我很抱歉不清楚。本质上这是我的主要目标 convIP 哎呀。我想我颠倒了乘法的顺序。 但我不明白 Bertelsen 的命令是如何工作的? @IShouldBuyABoat 他会将 1.1.0.1 转换为 1101。所以你是对的。除非他将小数点后 3 位以下的数字扩展到正确的前导 0 数,否则实际上无法提供唯一值。即使有了那个 mod,它的结果值也会有很多差距。 感谢Reduce代码,我可以用它来做其他事情@IShouldBuyABoat

以上是关于将IP地址(IPv4)转换为R中的整数的主要内容,如果未能解决你的问题,请参考以下文章

将 IP 地址字节转换为整数

如何在 C# 中将 IPv4 地址转换为整数?

ipv4地址向int型转换,int型数据向ipv4转换。

将 IPV4 转换为 IPV6 php

网络基础NAT - 网络地址转换

C# 中 将IP字符串转换为整型