Конвертировать из строки в байт странное поведение - PullRequest
3 голосов
/ 24 января 2012

У меня есть строка типа «0100110011001». Я хочу преобразовать ее в байтовый массив, чтобы массив содержал нули, и проблема в том, что после преобразования массив содержит 49, 48.Я использую следующий код и изменил тип кодировки

 System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
            byte result = encoding.GetBytes(str);

. Любая идея, почему это происходит, и как добиться желаемого результата

Ответы [ 3 ]

8 голосов
/ 24 января 2012

Вы просите, чтобы текст символов '0' и '1' был закодирован с использованием UTF-8 . В UTF-8 «0» представлен байтом 48, а «1» представлен байтом 49. (Не-ASCII символы представлены несколькими байтами.)

Звучит так, как будто вы действительно хотите двоичный анализатор - вы можете использовать Convert.ToByte(text, 2) для одного байта, но я не уверен, что есть что-то в структуре для преобразования строки произвольной длины в байтовый массив, анализируя его как двоичный файл. Я уверен, что есть много сторонних процедур, доступных в сети, хотя это не сложно.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.

2 голосов
/ 24 января 2012

Как однострочный оператор linq (не то, чтобы я рекомендовал это решение).

public static byte[] ToByteArray(this string source)
{
    return
        Regex.Matches(source.PadLeft(source.Length + source.Length % 8, '0'), "[01]{0,8}")
        .Cast<Match>()
        .Where(m => m.Success && !String.IsNullOrWhiteSpace(m.Groups[0].Value))
        .Select(m => Convert.ToByte(m.Groups[0].Value, 2))
        .ToArray();
}
2 голосов
/ 24 января 2012

48 - это код ASCII для 0, а 49 - код ASCII для 1. Существует много способов выполнить преобразование этой строки, но этого должно быть достаточно для самостоятельного управления.Удачи:)

Возможное решение:

    public static class StringExtensions
    {
        public static byte[] ToByteArray(this string str)
        {
            char[] arr = str.ToCharArray();
            byte[] byteArr = new byte[arr.Length];

            for (int i=0; i<arr.Length; ++i)
            {
                switch (arr[i])
                {
                    case '0': byteArr[i] = 0; break;
                    case '1': byteArr[i] = 1; break;
                    default: throw new Exception(arr[i]+" is not 0 or 1.");
                }
            }

            return byteArr;
        }
    }
...