2009-04-10 17 views
6

Un po 'di tempo fa (matricola delle superiori) Ho chiesto a un programmatore C++ veramente bravo che era un giovane di fare una semplice applicazione per convertire una stringa in binario. Mi ha dato il seguente codice di esempio:Come si converte una stringa in ascii in binario in 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; 
} 

Quindi credo che la mia domanda è: come faccio ad avere un equivalente alla funzione itoa in C#? O se non ce n'è uno, come potrei ottenere lo stesso effetto?

risposta

10

Questo è molto facile da fare 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

utilizza una classe ASCIIEncoding e chiamare GetBytes passando la stringa.

+0

Questo non mi sembra avere nulla a che fare con la domanda. Potrei sbagliarmi, perché la domanda è abbastanza vaga tranne che per il codice di esempio un po 'strano. – mquander

+0

L'esempio di codice è un po 'strano ma dovresti sapere cosa fa. Ottiene ogni valore char e lo converte nella sua rappresentazione binaria e lo emette. – Samuel

+0

Scusa, non volevo essere vago. Questo era solo un progetto per hobby a cui stavo lavorando. – Kredns

2

Non è chiaro esattamente ciò che si vuole, ma qui è quello che penso che vuoi:

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

Questo non è ciò che il codice C++ fa. Per questo, suggerisco:

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

Grazie, è fantastico !! L'ho usato per codificare stringhe di query ...

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

Ecco una funzione di estensione:

 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); 
     } 

si può utilizzare come:

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

che uscite:

01010100011001010111001101110100011010010110111001100111 

e se si aggiunge 'true' come parametro, i t separerà automaticamente ciascuna sequenza binaria.

Problemi correlati