Как преобразовать строку в ASCII в двоичную в C #? - PullRequest
6 голосов
/ 10 апреля 2009

Некоторое время назад (год обучения в старшей школе) я попросил действительно хорошего программиста на С ++, который был младшим, сделать простое приложение для преобразования строки в двоичный файл. Он дал мне следующий пример кода:

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

Итак, я предполагаю, что мой вопрос, как мне получить эквивалент функции itoa в C #? Или, если нет ни одного, как я могу достичь того же эффекта?

Ответы [ 5 ]

10 голосов
/ 10 апреля 2009

Это очень легко сделать с помощью 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 голосов
/ 10 апреля 2009

Не совсем точно, что вы хотите, но вот что, я думаю, вы хотите:

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);
2 голосов
/ 10 апреля 2009

Используйте класс ASCIIEncoding и вызовите GetBytes , передав строку.

1 голос
/ 24 июня 2016

Вот функция расширения:

        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' в качестве параметра, он будет автоматически отделять каждую двоичную последовательность.

1 голос
/ 06 июля 2010

Спасибо, это здорово !! Я использовал его для кодирования строк запроса ...

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.");
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...