2009-04-10 115 views
6

Hace un tiempo (primer año de la escuela secundaria) le pregunté a un programador de C++ realmente bueno que era un junior para hacer una aplicación simple para convertir una cadena a binaria. Me dio el siguiente ejemplo de código:¿Cómo convertir una cadena a ascii en binario en C#?

void ToBinary(char* str) 
{ 
    char* tempstr; 
    int k = 0; 

    tempstr = new char[90]; 

    while (str[k] != '\0') 
    { 
     itoa((int)str[k], tempstr, 2); 
     cout << "\n" << tempstr; 
     k++; 
    } 

    delete[] tempstr; 
} 

así que supongo que mi pregunta es ¿cómo puedo obtener un equivalente a la función itoa en C#? O si no hay uno, ¿cómo podría lograr el mismo efecto?

Respuesta

10

Esto es muy fácil de hacer con C#.

var str = "Hello world"; 

With LINQ 
foreach (string letter in str.Select(c => Convert.ToString(c, 2))) 
{ 
    Console.WriteLine(letter); 
} 

Pre-LINQ 
foreach (char letter in str.ToCharArray()) 
{ 
    Console.WriteLine(Convert.ToString(letter, 2)); 
} 
2

Utilice una clase ASCIIEncoding y llame al GetBytes pasando la cadena.

+0

Esto no parece tener nada que ver con la pregunta. Podría estar equivocado, porque la pregunta es bastante vaga a excepción del código de muestra algo extraño. – mquander

+0

La muestra del código es un poco extraña, pero debe saber lo que hace. Obtiene cada valor de char y lo convierte a su representación binaria y lo emite. – Samuel

+0

Lo siento, no quise ser vago. Este era solo un proyecto de hobby en el que estaba trabajando. – Kredns

2

No está claro exactamente lo que quiere, pero aquí es lo que pienso que deseas:

return Convert.ToString(int.Parse(str), 2); // "5" --> "101" 

Esto no es lo que hace el código C++. Para eso, sugiero:

string[] binaryDigits = str.Select(c => Convert.ToString(c, 2)); 
foreach(string s in binaryDigits) Console.WriteLine(s); 
1

Gracias, esto es genial !! Lo he utilizado para codificar las cadenas de consulta ...

protected void Page_Load(object sender, EventArgs e) 
{ 
    string page = ""; 
    int counter = 0; 
    foreach (string s in Request.QueryString.AllKeys) 
    { 
     if (s != Request.QueryString.Keys[0]) 
     { 
      page += s; 
      page += "=" + BinaryCodec.encode(Request.QueryString[counter]); 
     } 
     else 
     { 
      page += Request.QueryString[0]; 
     } 
     if (!page.Contains('?')) 
     { 
      page += "?"; 
     } 
     else 
     { 
      page += "&"; 
     } 
     counter++; 
    } 
    page = page.TrimEnd('?'); 
    page = page.TrimEnd('&'); 
    Response.Redirect(page); 
} 

public class BinaryCodec 
{ 
    public static string encode(string ascii) 
    { 
     if (ascii == null) 
     { 
      return null; 
     } 
     else 
     { 
      char[] arrChars = ascii.ToCharArray(); 
      string binary = ""; 
      string divider = "."; 
      foreach (char ch in arrChars) 
      { 
       binary += Convert.ToString(Convert.ToInt32(ch), 2) + divider; 
      } 
      return binary; 
     } 
    } 

    public static string decode(string binary) 
    { 
     if (binary == null) 
     { 
      return null; 
     } 
     else 
     { 
      try 
      { 
       string[] arrStrings = binary.Trim('.').Split('.'); 
       string ascii = ""; 
       foreach (string s in arrStrings) 
       { 
        ascii += Convert.ToChar(Convert.ToInt32(s, 2)); 
       } 
       return ascii; 
      } 
      catch (FormatException) 
      { 
       throw new FormatException("SECURITY ALERT! You cannot access a page by entering its URL."); 
      } 
     } 
    } 
} 
1

Aquí es una función de extensión:

 public static string ToBinary(this string data, bool formatBits = false) 
     { 
      char[] buffer = new char[(((data.Length * 8) + (formatBits ? (data.Length - 1) : 0)))]; 
      int index = 0; 
      for (int i = 0; i < data.Length; i++) 
      { 
       string binary = Convert.ToString(data[i], 2).PadLeft(8, '0'); 
       for (int j = 0; j < 8; j++) 
       { 
        buffer[index] = binary[j]; 
        index++; 
       } 
       if (formatBits && i < (data.Length - 1)) 
       { 
        buffer[index] = ' '; 
        index++; 
       } 
      } 
      return new string(buffer); 
     } 

Usted puede usarlo como:

Console.WriteLine("Testing".ToBinary()); 

que emite:

01010100011001010111001101110100011010010110111001100111 

y si agrega 'verdadero' como parámetro, yo t separará automáticamente cada secuencia binaria.

Cuestiones relacionadas