【问题标题】:How do you convert a string to ascii to binary in C#?如何在 C# 中将字符串转换为 ascii 到二进制?
【发布时间】:2010-10-18 16:52:06
【问题描述】:

不久前(高中一年级),我请一位非常优秀的 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;
}

所以我想我的问题是如何获得与 C# 中的 itoa 函数等效的函数?或者如果没有,我怎么能达到同样的效果?

【问题讨论】:

    标签: c# c++ binary


    【解决方案1】:

    用 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】:

      使用ASCIIEncoding 类并调用GetBytes 传递字符串。

      【讨论】:

      • 这在我看来与这个问题没有任何关系。我可能是错的,因为除了有些奇怪的示例代码之外,这个问题非常模糊。
      • 代码示例有点奇怪,但您应该知道它的作用。它获取每个 char 值并将其转换为二进制表示形式并输出。
      • 对不起,我不是故意含糊的。这只是我正在做的一个爱好项目。
      【解决方案3】:

      不清楚你想要什么,但我认为你想要的是:

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

      这不是 C++ 代码所做的。为此,我建议:

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

      【讨论】:

        【解决方案4】:

        谢谢,太好了!!我用它来编码查询字符串...

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

        【讨论】:

          【解决方案5】:

          这是一个扩展函数:

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

          你可以像这样使用它:

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

          哪个输出:

          01010100011001010111001101110100011010010110111001100111
          

          如果你添加'true'作为参数,它会自动分隔每个二进制序列。

          【讨论】:

            猜你喜欢
            • 2014-06-14
            • 1970-01-01
            • 1970-01-01
            • 2012-07-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-30
            相关资源
            最近更新 更多