2009-04-10 11 views
6

Un certain temps (année de première année de lycée) Je demande un programmeur très bon C++ qui était un junior pour faire une application simple pour convertir une chaîne en binaire. Il m'a donné l'exemple de code suivant:Comment convertir une chaîne en ascii en binaire 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; 
} 

donc je suppose que ma question est de savoir comment puis-je obtenir un équivalent à la fonction itoa en C#? Ou s'il n'y en a pas un, comment pourrais-je obtenir le même effet?

Répondre

10

Ceci est très facile à faire avec 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

Utilisez une classe ASCIIEncoding et appelez GetBytes passer la chaîne.

+0

Cela ne me semble pas avoir quoi que ce soit à voir avec la question. Je peux me tromper, parce que la question est assez vague, sauf pour le code un peu étrange. – mquander

+0

L'exemple de code est un peu étrange, mais vous devriez savoir ce qu'il fait. Il obtient chaque valeur de char et le convertit en sa représentation binaire et le sort. – Samuel

+0

Désolé, je ne voulais pas être vague. C'était juste un projet de loisir sur lequel je travaillais. – Kredns

2

Il est précisément pas clair ce que vous voulez, mais voici ce que je pense que vous voulez:

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

Ce n'est pas ce que le code C++ fait. Pour cela, je suggère:

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

Merci, ce qui est excellent !! Je l'ai utilisé pour encoder les chaînes de requête ...

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

est ici une fonction d'extension:

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

Vous pouvez l'utiliser comme:

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

qui délivre:

01010100011001010111001101110100011010010110111001100111 

et si vous ajoutez « true » en tant que paramètre, i t séparera automatiquement chaque séquence binaire.

Questions connexes