2009-08-13 28 views
20

Tengo una cadena binaria, ingresada por el usuario, que necesito convertir a un número entero.Cadena binaria al número entero

Al principio naivly utiliza esta línea simple:

Convert.ToInt32("11011",2); 

Desafortunadamente esto produce una excepción si el usuario introduce el número entero directamente.

Convert.ToInt32("123",2); // throws Exception 

¿Cómo puedo asegurarme de que la cadena ingresada por el usuario en realidad es una cadena binaria?

  • try..catch .... pero eso es demasiado feo.
  • algo así como 'Int32.TryParse' quizás.

Gracias

+1

¿Cómo ingresa el usuario la cadena? Si se trata de un formulario, ¿no podría limitarlo a aceptar solo '0' y '1'? – outis

+3

¿Por qué 'try' -' catch' "feo"? – RaYell

+0

Probablemente tengas razón, no es tan feo. De hecho fui con esto porque el valor Hex también es posible de repente. Por lo tanto, algunas capturas de prueba simples son la solución más simple y fácil. Gracias a todos. – eric

Respuesta

24

Se puede usar un Regex para comprobar que se trata de "^ [01] + $" (o mejor, "^ [01] {1,32} $"), y luego use Convert?

por supuesto, las excepciones son poco probable que sea un gran problema de todos modos! ¿Poco elegante? tal vez. Pero ellos funcionan.

Ejemplo (con formato de espacio vertical):

static readonly Regex binary = new Regex("^[01]{1,32}$", RegexOptions.Compiled); 
static void Main() { 
    Test(""); 
    Test("01101"); 
    Test("123"); 
    Test("0110101101010110101010101010001010100011010100101010"); 
} 
static void Test(string s) { 
    if (binary.IsMatch(s)) { 
     Console.WriteLine(Convert.ToInt32(s, 2)); 
    } else { 
     Console.WriteLine("invalid: " + s); 
    } 
} 
+0

Esto no maneja correctamente la conversión de Convert.ToString ((largo) Int32.MaxValue + 1, 2). Esto debe rechazarse pero se convierte incorrectamente a Int32.MinValue. –

+0

¿Por qué debería ser rechazado? Es un valor binario válido de 32 bits. Si eliges interpretarlo como int32, entonces seguro: cualquier cosa con el conjunto de msb será negativa ... y? –

+0

Gracias gran solución. De hecho fui con eso. Pero los requisitos cambiaron algo así que decidí probar - catch. Es la solución más simple y limpia – eric

2

Gracias por la gran y muy rápida respuesta!

Desafortunadamente mis requisitos han cambiado. Ahora el usuario puede prácticamente ingresar cualquier formato. Binario, Decimal, Hex. Así que decidí que probar - captura solo proporciona la solución más simple y limpia.

Así que para una buena medida estoy publicando el código que estoy usando ahora. Creo que es bastante claro e incluso algo elegante, o eso creo ^^.

switch (format) 
{ 
    case VariableFormat.Binary: 
     try 
     { 
      result = Convert.ToInt64(value, 2) 
     } 
     catch 
     { 
      // error handling 
     } 
     break; 
    case VariableFormat.Decimal: 
     try 
     { 
      result = Convert.ToInt64(value, 10) 
     } 
     catch 
     { 
      // error handling 
     } 
     break; 
    case VariableFormat.Hexadecimal: 
     try 
     { 
      result = Convert.ToInt64(value, 16) 
     } 
     catch 
     { 
      // error handling 
     } 
     break; 
} 

Así que gracias por animarme a utilizar try - catch, creo que realmente mejoró la legibilidad de mi código.

Gracias

+0

¿Qué, no te gusta octal? En serio, ¿y si alguien ingresa '11' y lo dice en la base 10? La solución estándar sería usar un prefijo ('0b', '', '0x'), pero puede no ajustarse a sus requisitos. – outis

+0

Sí, no octal ^^. El usuario tiene que elegir en el cuadro combinado qué formato quiere usar.Pensé en tu solución también, pero parecía más fácil con un combobox. Gracias tan buena entrada. – eric

Cuestiones relacionadas