Преобразовать один шестнадцатеричный символ в его значение байта в C #
Вопрос
Это преобразует 1 шестнадцатеричный символ в его целочисленное значение, но необходимо создать (под) строку.
Convert.ToInt32(serializedString.Substring(0,1), 16);
Есть ли в .NET встроенный способ преобразования одного шестнадцатеричного символа в его байтовое (или int, неважно) значение, которое не требует создания новой строки?
Решение
int value = "0123456789ABCDEF".IndexOf(char.ToUpper(sourceString[index]));
Или даже быстрее (вычитание или поиск по массиву), но без проверки на неправильный ввод:
int HexToInt(char hexChar)
{
hexChar = char.ToUpper(hexChar); // may not be necessary
return (int)hexChar < (int)'A' ?
((int)hexChar - (int)'0') :
10 + ((int)hexChar - (int)'A');
}
Другие советы
Поправь меня, если я ошибаюсь, но можешь ли ты просто использовать
Convert.ToByte(stringValue, 16);
до тех пор, пока stringValue представляет шестнадцатеричное число? Разве это не точка базового параметра?
Строки являются неизменяемыми, я не думаю, что есть способ получить значение байта подстроки char в индексе 0 без создания новой строки
Конечно, вы можете получить шестнадцатеричное значение без необходимости создавать другую строку. Я не уверен, что это действительно принесет вам пользу с точки зрения производительности, но раз вы спросили, вот что вы просили.
public int FromHex(ref string hexcode, int index)
{
char c = hexcode[index];
switch (c)
{
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'A':
case 'a':
return 0xa;
case 'B':
case 'b':
return 0xb;
case 'C':
case 'c':
return 0xc;
case 'D':
case 'd':
return 0xd;
case 'E':
case 'e':
return 0xe;
case 'F':
case 'f':
return 0xf;
case '0':
default:
return 0;
}
}
}
Если вы знаете, что шестнадцатеричное значение является только байтом, просто преобразуйте его в Int32 и затем приведите
var b = (byte)(Convert.ToInt32(serializedString, 16));
Encoding.UTF8.GetBytes( serializedString.ToCharArray(), 0, 1)
Дешевле может быть:
Encoding.UTF8.GetBytes( new char[]{ serializedString[0] }, 0, 1)
Это добавит только интересный символ к символу [], а не всю строку.