Преобразование строки в байтовый массив в C #
Я довольно новичок в C #. Я конвертирую что-то из VB в C #. Имея проблему с синтаксисом этого утверждения:
if ((searchResult.Properties["user"].Count > 0)) { profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]); }
Затем я вижу следующие ошибки:
Аргумент 1: невозможно преобразовать из ‘объекта’ в ‘byte []’
- Как написать символ и в файле android strings.xml
- String.Format не работает в TypeScript
- Заполнение строк в C
- Сравнение строки с пустой строкой (Java)
- Форматировать строки в методе Console.WriteLine
Наилучшее перегруженное соответствие метода для ‘System.Text.Encoding.GetString (byte [])’ имеет некоторые недопустимые аргументы
Я попытался исправить код, основанный на этом сообщении, но все равно не успел
string User = Encoding.UTF8.GetString("user", 0);
Какие-либо предложения?
- Когда использовать StringBuilder в Java
- Удалить пробел из строки в Objective-C
- как преобразовать строку в дату в mysql?
- Как избежать% в String.Format?
- Android: что-то лучше, чем андроид: ellipsize = "end", чтобы добавить "..." в укороченные длинные строки?
- Снижение производительности String.intern ()
- Как добавить текст в изображение в java?
- C / C ++: оптимизация указателей на строковые константы
Если у вас уже есть байтовый массив, вам нужно знать, какой тип кодирования использовался для его преобразования в этот массив байтов.
Например, если массив байтов был создан следующим образом:
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()