Преобразование строки в байтовый массив в C #

Я довольно новичок в C #. Я конвертирую что-то из VB в C #. Имея проблему с синтаксисом этого утверждения:

if ((searchResult.Properties["user"].Count > 0)) { profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]); } 

Затем я вижу следующие ошибки:

Аргумент 1: невозможно преобразовать из ‘объекта’ в ‘byte []’

Наилучшее перегруженное соответствие метода для ‘System.Text.Encoding.GetString (byte [])’ имеет некоторые недопустимые аргументы

Я попытался исправить код, основанный на этом сообщении, но все равно не успел

 string User = Encoding.UTF8.GetString("user", 0); 

Какие-либо предложения?

Если у вас уже есть байтовый массив, вам нужно знать, какой тип кодирования использовался для его преобразования в этот массив байтов.

Например, если массив байтов был создан следующим образом:

 byte[] bytes = Encoding.UTF8.GetBytes(someString); 

Вам нужно будет повернуть его обратно в строку следующим образом:

 string someString = Encoding.UTF8.GetString(bytes); 

Если вы можете найти в коде, который вы унаследовали, кодировку, используемую для создания массива байтов, тогда вы должны быть установлены.

Прежде всего, добавьте пространство имен System.Text

 using System.Text; 

Затем используйте этот код

 string input = "some text"; byte[] array = Encoding.ASCII.GetBytes(input); 

Надеюсь это исправить!

Также вы можете использовать метод расширения, чтобы добавить метод к типу string как показано ниже:

 static class Helper { public static byte[] ToByteArray(this string str) { return System.Text.Encoding.ASCII.GetBytes(str); } } 

И используйте его, как показано ниже:

 string foo = "bla bla"; byte[] result = foo.ToByteArray(); 
 static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } static string GetString(byte[] bytes) { char[] chars = new char[bytes.Length / sizeof(char)]; System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); return new string(chars); } 

использовать это

 byte[] myByte= System.Text.ASCIIEncoding.Default.GetBytes(myString); 

Следующий подход будет работать только в том случае, если символы 1 байт. (Unicode по умолчанию не работает, так как он равен 2 байтам)

 public static byte[] ToByteArray(string value) { char[] charArr = value.ToCharArray(); byte[] bytes = new byte[charArr.Length]; for (int i = 0; i < charArr.Length; i++) { byte current = Convert.ToByte(charArr[i]); bytes[i] = current; } return bytes; } 

Простота

Уточнение в редакции JustinStolle (использование блоком BlockCopy Эрана Йогева).

Предлагаемое решение действительно быстрее, чем использование Encoding. Проблема в том, что он не работает для кодирования байтовых массивов неравномерной длины. Как указано, он вызывает исключение из-за границы. Увеличение длины на 1 оставляет конечный байт при декодировании из строки.

Для меня возникла необходимость, когда я хотел кодировать из DataTable в JSON . Я искал способ кодирования двоичных полей в строки и декодирования из строки обратно в byte[] .

Поэтому я создал два classа – один, который обертывает вышеупомянутое решение (при кодировании из строк это прекрасно, потому что длины всегда четные), а другой, который обрабатывает byte[] кодировку byte[] .

Я решил проблему с неравномерной длиной, добавив один символ, который говорит мне, что исходная длина двоичного массива была нечетной (‘1’) или даже (‘0’)

Следующим образом:

 public static class StringEncoder { static byte[] EncodeToBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } static string DecodeToString(byte[] bytes) { char[] chars = new char[bytes.Length / sizeof(char)]; System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); return new string(chars); } } public static class BytesEncoder { public static string EncodeToString(byte[] bytes) { bool even = (bytes.Length % 2 == 0); char[] chars = new char[1 + bytes.Length / sizeof(char) + (even ? 0 : 1)]; chars[0] = (even ? '0' : '1'); System.Buffer.BlockCopy(bytes, 0, chars, 2, bytes.Length); return new string(chars); } public static byte[] DecodeToBytes(string str) { bool even = str[0] == '0'; byte[] bytes = new byte[(str.Length - 1) * sizeof(char) + (even ? 0 : -1)]; char[] chars = str.ToCharArray(); System.Buffer.BlockCopy(chars, 2, bytes, 0, bytes.Length); return bytes; } } 
 var result = System.Text.Encoding.Unicode.GetBytes(text); 

Кто-нибудь видит причину, почему бы не сделать это?

 mystring.Select(Convert.ToByte).ToArray() 
  • Объединение нулевых строк в Java
  • Сравнить номера версий без использования функции split
  • Сравнение строк с ==, которые объявлены окончательными в Java
  • Как проверить, отображается ли один символ в строке?
  • Определите, является ли строка C допустимым int в C
  • Удалить расширение файла из строки имени файла
  • Как прочитать содержимое файла в строке в C?
  • Конкатенация строк: оператор concat () vs "+"
  • Как обрезать пробелы?
  • Алгоритм поиска нескольких совпадений строк
  • Строковые литералы: куда они идут?
  • Давайте будем гением компьютера.