string.StartsWith

Iniciado por TickTack, 14 Mayo 2017, 13:08 PM

0 Miembros y 1 Visitante están viendo este tema.

TickTack

Hola,

hay algo que no entiendo.

Estaba haciendo un programa que filtra ips y vi un comportamiento algo raro en StartsWith.

Yo hice este metodo:

Código (csharp) [Seleccionar]

public static bool Check(IPAddress ipaddr)
       {
           foreach (String ip in bad_ranges)
               if (ipaddr.ToString().StartsWith(ip))
               {
                   return true;
               }

           bool result = false;
           return result;
       }


Y aqui la lista de ips y de comienzos de ips que debe ser filtrada:

Código (csharp) [Seleccionar]

private static String[] bad_ranges = new String[]
       {
           "46.16",
           "64.55.",
           "69.22.",
           "69.162.",
           "69.167.",
         
           "128.241.",
           "140.174.",
           "204.2.",
           "206.14.",
           "209.107.",
           "199.255.",
           "31.210.102.38",
           "46.4.62.16",
           "67.221.255.12",
           "74.82.218.250",
           "77.245.78.10",
           "79.168.9.111",
           "83.142.226.101",
           "85.195.76.6",
           "89.217.238.",
           "95.141.",
           "95.142.",
           "95.143.",
           "95.215.",
           "109.74.3.24",
           "124.248.202.119",
           "174.36.47.170",
           "176.227.194.146",
           "188.227.180.2",
           "209.239.120.120",
           "216.185.105.34",
           "108.61.74.99",
           "79.141.165.21",
           "24.99.89.166",
           "199.58.84.",
           "50.116.5.",
           "23.92.22.",
           "64.62.201.",
           "162.210.196.",
           "192.96.203.",
           "199.58.84."
       };


Y bueno. Al ingresar esta ip: 46.105.121.37 me la filtra el programa.

Pero porque?

Si en la lista no agregue esa ip ni una ip que empieze con 46.105.

StartsWith tiene otra significacion a parte de empezar por los caracteres dados?

Gracias y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Eleкtro

#1
Cita de: TickTack en 14 Mayo 2017, 13:08 PMStartsWith tiene otra significacion a parte de empezar por los caracteres dados?

No, no lo tiene. La función String.StartsWith() determina si un String comienza con las caracteres de otro String.

Cita de: TickTack en 14 Mayo 2017, 13:08 PMAl ingresar esta ip: 46.105.121.37 me la filtra el programa.
Pero porque?
Si en la lista no agregue esa ip ni una ip que empieze con 46.105.

La función Check() que has escrito, al enviarle como argumento la IP 46.105.121.37, da un resultado negativo. Es decir, no la filtra, a diferencia de lo que tú dices estar experimentando al pasarle esa IP.

Deberías mostrarnos la manera en la que instancias la clase IPAddress. Intuyo que debes estar cometiendo el fallo ahí, pues podrías estar usando de forma incorrecta alguno de sus constructores, y como consecuencia daría un resultado imprevisto de validación en la función Check() -> String.StartsWith().

Para lo que quieres hacer, te conviene utilizar la función IPAddress.Parse():
Código (csharp) [Seleccionar]
IPAddress ip = IPAddress.Parse("46.105.121.37");
...y entonces el código que has mostrado te debería funcionar correctamente.




Aparte de eso, suponiendo que puedas utilizar LINQ entonces puedes simplificar el bloque de código de la función Check(), a esto otro:
Código (csharp) [Seleccionar]
public static bool ValidateIP(IPAddress address, string[] addressRangeBlackList) {
   return (from addressRange in addressRangeBlackList
           where address.ToString().StartsWith(addressRange, StringComparison.Ordinal)
           select true
          ).Any();
}

...Aunque cabe mencionar que esto supondría un inapreciable impacto negativo en el rendimiento, contado en escasos milisegundos de tiempo de ejecución. Siempre que el Array de rangos de ip no contenga miles de elementos ni tampoco se intente validar miles de ips en un determinado intervalo de tiempo demasiado corto, y suponiendo que preferamos la simplificación de código, entonces sería preferible optar por la elegancia de LINQ-to-Objects, que por la velocidad de ejecución.

¡Saludos!








TickTack

Hola Elektro,

Citar
La función Check() que has escrito, al enviarle como argumento la IP 46.105.121.37, da un resultado negativo. Es decir, no la filtra, a diferencia de lo que tú dices estar experimentando al pasarle esa IP.

Pero podes creer que sea tan estupido?
Increible. Por esos errores hago un tema. La verdad que esta vez nome mereci tu ayuda por estupido.

Era asi como tu dijiste. Solucione el problema.

Muchas gracias
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."