World: r3wp
[Core] Discuss core issues
older newer | first last |
Steeve 16-Apr-2010 [16333x3] | >> (-1 xor (to-integer 2 ** (32 - mask-range)) - 1) same thing than: >>shift -1 mask-range |
sorry, I mean shift -1 32 - mask-range | |
not tested though... | |
Andreas 16-Apr-2010 [16336] | Only in R3, though, where, per default, shift == lshift, in R2 shift == rshift. |
Steeve 16-Apr-2010 [16337] | ah yes, I forgot |
Andreas 16-Apr-2010 [16338x4] | R2 needs shift/left to lshift, R3 rshifts with negative offsets. |
And Brian, I fear your function is flawed. | |
>> in-ip-range? "10.10.10.10" "10.10.0.0/24" ; == true Which is wrong. | |
From a quick glance your masking logic is wrong. You need to mask both the address and the network and then compare if the results match. | |
Steeve 16-Apr-2010 [16342] | I guess it's in the last line:::: ip-as-integer = (ip-as-integer and mask-integer) |
Andreas 16-Apr-2010 [16343x3] | I have a correct function for R3 lying around somewhere ... if only I could find it :) |
Ah, got it. | |
cidr-match?: funct [address [tuple!] network [tuple!] bits [integer!]] [ mask: skip to-binary (shift -1 32 - bits) 4 (mask and to-binary address) = (mask and to-binary network) ] | |
Steeve 16-Apr-2010 [16346] | not R2 though ;-) |
Andreas 16-Apr-2010 [16347] | For R3 , as I mentioned. |
Steeve 16-Apr-2010 [16348] | I on |
Andreas 16-Apr-2010 [16349x3] | Usage: >> cidr-match? 10.10.10.10 10.10.0.0 16 ; == true >> cidr-match? 10.10.10.10 10.10.0.0 24 ; == false |
It's much nicer in R3, as to-binary on numbers works properly :) | |
In any case, here's an R2 version (assuming 2.7.7+ for funct): cidr-match?: funct [address [tuple!] network [tuple!] bits [integer!]] [ mask: shift/left -1 32 - bits (mask and to-integer to-binary address) = (mask and to-integer to-binary network) ] | |
Steeve 16-Apr-2010 [16352] | See that weird one :) cidr-match?: funct [address [tuple!] network [tuple!] bits [integer!]] [ mask: to-tuple skip to-binary (shift -1 32 - bits) 4 mask and address xor network = .0. ] |
BrianH 16-Apr-2010 [16353] | Andreas, I'm sure my function is flawed - I just came up with it right then. Thanks for the fix :) |
Steeve 16-Apr-2010 [16354] | rather optimized... cidr-match?: funct [address [tuple!] network [tuple!] bits [integer!]] [ mask: to-tuple to-binary shift -1 64 - bits mask and address xor network = .0. ] |
Andreas 16-Apr-2010 [16355] | Heh, that's great Steeve. Esp the ".0." |
Steeve 16-Apr-2010 [16356] | yeah, .0. = 0.0.0 = 0.0.0.0.0 ... |
Andreas 16-Apr-2010 [16357] | Yeah :) |
BrianH 16-Apr-2010 [16358x2] | Yeah, silly me, forgot about SHIFT :) |
That should work on R2 with 32 instead of 64. | |
Steeve 16-Apr-2010 [16360] | Yup |
Andreas 16-Apr-2010 [16361] | Nope. You'd need shift/left on R2 |
Steeve 16-Apr-2010 [16362] | He knew... :) |
Andreas 16-Apr-2010 [16363] | Just a reminder :) |
BrianH 16-Apr-2010 [16364x2] | The last time I did IP calculations in REBOL was before 2.7.6 came out, so the reminder is appreciated :) |
Though your functions do indicate the value of using REBOL's datatypes properly. Take note, Pekr, no strings :) | |
Pekr 17-Apr-2010 [16366x2] | wow, what a bunch of reactions :-) BrianH - I used strings, because of original Mikrotik format. They use 10.10.10.10/24 format for IP, so it was easier for me to carry around in a string form, then parse it later when needed .... IP arithmetics, and ranges would be 2 nice new datatypes for REBOL imo :-) |
Steeve - your optimised version for R2 does not work correctly: >> cidr-match? 10.10.10.10 10.10.10.0 24 == false | |
Steeve 17-Apr-2010 [16368] | Because it was for R3 only, try this for R2: cidr-match?: func [address [tuple!] network [tuple!] bits [integer!]] [ address xor network and (to-tuple debase/base to-hex shift/left -1 32 - bits 16) = .0. ] Don't know if it's faster than Andreas's, though |
ChristianE 17-Apr-2010 [16369] | (-:-:- = -:0:-) = (0:-:0 = 0:0:0) |
Steeve 17-Apr-2010 [16370x2] | -:- |
and so: +:+ | |
Henrik 18-Apr-2010 [16372] | I'm trying to figure out which index comes earlier in two different references to the same block and was trying with MIN and MAX, because I didn't want to resort to LESSER? INDEX? things. The result with MIN/MAX doesn't seem to be particularly useful. What is the basis of comparison of two blocks when using MIN and MAX? |
BrianH 18-Apr-2010 [16373] | Their contents, not their indexes. |
Henrik 18-Apr-2010 [16374] | yes, I figure that, but what's the basis for comparison? |
Steeve 18-Apr-2010 [16375] | ... |
ChristianE 18-Apr-2010 [16376] | Their first elements, as in >> max [0 9 9] [2] == [2] |
Henrik 18-Apr-2010 [16377x2] | are you sure? >> min [b 1] [b b 2] == [b b 2] |
also because MIN and MAX don't compare on words, so there must be a different base of comparison. | |
ChristianE 18-Apr-2010 [16379] | >> min reduce [word! integer!] reduce [word! word! integer!] == [word! word! integer!] |
BrianH 18-Apr-2010 [16380x2] | MIN and MAX compare the spelling of words in blocks in R3. |
And it's not just the first element: >> min [b b] [b a] == [b a] | |
ChristianE 18-Apr-2010 [16382] | Henrik just showed that. |
older newer | first last |