Convierta un solo carácter hexadecimal a su valor de byte en C #
Pregunta
Esto convertirá 1 carácter hexadecimal a su valor entero, pero necesita construir una (sub) cadena.
Convert.ToInt32(serializedString.Substring(0,1), 16);
¿Tiene .NET una forma integrada de convertir un solo carácter hexadecimal a su valor de byte (o int, no importa) que no implique la creación de una nueva cadena?
Solución
int value = "0123456789ABCDEF".IndexOf(char.ToUpper(sourceString[index]));
O incluso más rápido (sustracción frente a búsqueda de matriz), pero sin verificar la entrada incorrecta:
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');
}
Otros consejos
Corrígeme si estoy equivocado, pero ¿puedes simplemente usar
Convert.ToByte(stringValue, 16);
siempre que stringValue represente un número hexadecimal? ¿No es ese el punto del parámetro base?
Las cadenas son inmutables, no creo que haya una manera de obtener el valor de byte de subcadena del carácter en el índice 0 sin crear una nueva cadena
Seguro que puede obtener el valor hexadecimal sin necesidad de crear otra cadena. No estoy seguro de lo que realmente te va a ganar, en cuanto al rendimiento, pero como lo preguntaste, esto es lo que has solicitado.
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;
}
}
}
Si sabe que el valor hexadecimal es solo un byte, simplemente conviértalo a Int32 y luego emita
var b = (byte)(Convert.ToInt32(serializedString, 16));
Encoding.UTF8.GetBytes( serializedString.ToCharArray(), 0, 1)
Más barato podría ser:
Encoding.UTF8.GetBytes( new char[]{ serializedString[0] }, 0, 1)
Esto solo agregará el char interesante al char [] y no la cadena completa.