[R] INET_NTOA equivalent?
Eberhard Lisse
nospam at lisse.na
Thu Apr 24 11:34:59 CEST 2014
Thank you,
el
on 2014-04-24, 10:33 Martin Maechler said the following:
>>>>>> "EL" == Eberhard Lisse <nospam at lisse.NA>
>>>>>> on Thu, 24 Apr 2014 01:21:37 +0100 writes:
>
> EL> In MySQL
> EL> SELECT INET_ATON('127.0.0.1')
>
> EL> returns the integer 2130706433
>
> EL> Is there a function in R to reverse that, ie so that something like
>
> EL> ip <- inet_ntoa(2130706433)
>
> EL> would put '127.0.0.1' into ip?
>
> almost:
>
> install.packages("sfsmisc")
> require("sfsmisc")
>
> # NTOA :
>
> > digitsBase(2130706433, base = 256)
> Class 'basedInt'(base = 256) [1:1]
> [,1]
> [1,] 127
> [2,] 0
> [3,] 0
> [4,] 1
>
> # ATON :
>
> > as.intBase(digitsBase(2130706433, base = 256), base = 256)
> 1
> 2130706433
> >
>
> So, an easy solution seems
>
>
>> ip.ntoa <- function(n) paste(sfsmisc::digitsBase(n, base = 256), collapse=".")
>> ip.ntoa(2130706433)
> [1] "127.0.0.1"
>>
>
> but that does not vectorize (work for length(n) > 1 )
> correctly.
>
> The correct solution then is
>
> ip.ntoa <- function(n)
> apply(sfsmisc::digitsBase(n, base = 256), 2, paste, collapse=".")
>
> and that does work nicely:
>
>> ip.ntoa(1000000000+ (0:10))
>
> [1] "59.154.202.0" "59.154.202.1" "59.154.202.2" "59.154.202.3" "59.154.202.4"
> [6] "59.154.202.5" "59.154.202.6" "59.154.202.7" "59.154.202.8" "59.154.202.9"
> [11] "59.154.202.10"
>
> right ?
>
> --
> Martin Maechler, ETH Zurich
>
>
More information about the R-help
mailing list