Строковый литерал в байтах - PullRequest
5 голосов
/ 08 декабря 2011

Я делаю приложение форм Visual C #.У меня есть текстовое поле, в котором пользователь должен ввести число и заглавную букву, например «9D».

Что мне нужно сделать, это поместить эту букву в байтовый массив как байт ... так что в моем байтемассив это будет:

array[index] = 0x9D

Я знаю, что класс текстового поля представляет 9D в виде строки.Я запутался в том, как превратить его в буквальный байт (9D) и вставить его в массив.

Впервые в .Net, поэтому любая помощь будет оценена.Я посмотрел на класс System.Convert и не вижу ничего, что я мог бы использовать.

Ответы [ 3 ]

6 голосов
/ 08 декабря 2011

Использование Byte.Parse(string, NumberStyles):

byte b = Byte.Parse(text, NumberStyles.HexNumber);

Или Byte.TryParse(string, NumberStyles, IFormatProvider, out Byte) для более изящной обработки некорректного ввода.

4 голосов
/ 08 декабря 2011

Если вы хотите, чтобы это было сделано немного быстрее, и чтобы разрешить '0x' перед числом, вы можете использовать Convert.ToByte("0x9D", 16). В моем ограниченном тестировании Convert.ToByte был в два раза быстрее Byte.Parse

Вы также можете проверить ввод с помощью простого Regex . Таким образом, вы знаете, что строка будет проанализирована перед вызовом любого метода для ее анализа или преобразования.

// Checks that the string is either 2 or 4 characters and contains only valid hex
var regex = new Regex(@"^(0x)*[a-fA-F\d]{2}$")

Тестовый код:

const int count = 100000;
var data = "9D";
var sw = new Stopwatch();
sw.Reset();

byte dest = 0;
sw.Start();
for(int i=0; i < count; ++i)
{
    dest = Byte.Parse(data, NumberStyles.AllowHexSpecifier);
}
sw.Stop();
var parseTime = sw.ElapsedMilliseconds;
sw.Reset();
sw.Start();
for(int i=0; i < count; ++i)
{
    dest = Convert.ToByte(data, 16);
}
sw.Stop();
var convertTime = sw.ElapsedMilliseconds;
1 голос
/ 08 декабря 2011

Используйте Byte.Parse для разбора строки в Byte.

array[index] = Byte.Parse("9D", NumberStyles.AllowHexSpecifier);

Обратите внимание, что префикс 0x приведет к ошибке разбора, поэтому вы можете захотетьраздеть его, если он существует.

...