2009-04-10 71 views
6

Một thời gian trở lại (năm thứ nhất của trường trung học) Tôi đã hỏi một lập trình viên C++ thực sự giỏi, là một cơ sở để tạo ra một ứng dụng đơn giản để chuyển đổi một chuỗi thành nhị phân. Ông đã cho tôi mẫu mã sau đây:Làm thế nào để bạn chuyển đổi một chuỗi thành ascii thành nhị phân trong 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; 
} 

Vì vậy, tôi đoán câu hỏi của tôi là làm thế nào để tôi nhận được một tương đương với chức năng itoa trong C#? Hoặc nếu không có cách nào tôi có thể đạt được hiệu quả như vậy?

Trả lời

10

Điều này rất dễ thực hiện với 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

Sử dụng lớp ASCIIEncoding và gọi GetBytes chuyển chuỗi.

+0

Điều này dường như không liên quan gì đến câu hỏi này. Tôi có thể sai, bởi vì câu hỏi là khá mơ hồ, ngoại trừ mã mẫu hơi lẻ. – mquander

+0

Mẫu mã hơi lạ nhưng bạn nên biết nó làm gì. Nó nhận được mỗi giá trị char và chuyển đổi nó thành biểu diễn nhị phân của nó và xuất ra nó. – Samuel

+0

Xin lỗi, tôi không có ý nói mơ hồ. Đây chỉ là một dự án sở thích mà tôi đang làm. – Kredns

2

Nó không rõ ràng chính xác những gì bạn muốn, nhưng đây là những gì tôi nghĩ rằng bạn muốn:

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

Đây không phải là những gì cáC++ mã C thực hiện. Vì lý do đó, tôi đề nghị:

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

Cảm ơn, điều này thật tuyệt vời !! Tôi đã sử dụng nó để mã hóa chuỗi truy vấn ...

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

Dưới đây là một chức năng mở rộng:

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

Bạn có thể sử dụng nó như:

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

mà kết quả đầu ra:

01010100011001010111001101110100011010010110111001100111 

và nếu bạn thêm 'true' làm thông số, tôi t sẽ tự động tách riêng từng chuỗi nhị phân.

Các vấn đề liên quan