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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top