Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Converter endereço IP (IPv4) em um inteiro em R


Você não foi totalmente específico sobre qual conversão queria, então multipliquei os valores decimais pelo que achei apropriado (pensando que os itens de três dígitos eram na verdade equivalentes de dígitos em números de "base 256" e reexibidos na base 10). Se você quisesse que a ordem dos locais fosse invertida, como vi sugerido em outro lugar, você reverteria a indexação de 'vals' em ambas as soluções
 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

(Geralmente, é melhor prática de TI especificar o que você acha que é a resposta correta para que o teste possa ser feito. O comentário de Bertelson acima seria mais rápido e usa implicitamente 1000, 1000^2 e 1000^3 como os fatores.)

Estou tentando simplificar o código, mas temo que a necessidade de usar Reduce("+", ...) pode torná-lo mais complexo. Você não pode usar sum porque não é vetorizado.
 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