Domanda

Questo convertirà 1 carattere esadecimale nel suo valore intero, ma deve costruire una (sotto) stringa.

Convert.ToInt32(serializedString.Substring(0,1), 16);

.NET ha un modo integrato per convertire un singolo carattere esadecimale nel suo valore byte (o int, non importa) che non comporta la creazione di una nuova stringa?

È stato utile?

Soluzione

int value = "0123456789ABCDEF".IndexOf(char.ToUpper(sourceString[index]));

O ancora più veloce (sottrazione vs. ricerca di array), ma nessun controllo per input errato:

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');
}

Altri suggerimenti

Correggimi se sbaglio ma puoi semplicemente usare

Convert.ToByte(stringValue, 16);

fintanto che stringValue rappresenta un numero esadecimale? Non è questo il punto del parametro base?

Le stringhe sono immutabili, non penso che ci sia un modo per ottenere il valore di byte di sottostringa del carattere all'indice 0 senza creare una nuova stringa

Sicuro che puoi ottenere il valore esadecimale senza mai dover creare un'altra stringa. Non sono sicuro di cosa ti guadagnerà davvero, per quanto riguarda le prestazioni, ma dato che hai chiesto, ecco cosa hai richiesto.

    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;
            }
        }
    }

Se sapete che il valore esadecimale è solo un byte, convertitelo in Int32 e poi lanciate

var b = (byte)(Convert.ToInt32(serializedString, 16));
Encoding.UTF8.GetBytes( serializedString.ToCharArray(), 0, 1)

Più economico potrebbe essere:

Encoding.UTF8.GetBytes( new char[]{ serializedString[0] }, 0, 1)

Questo aggiungerà solo il carattere interessante al carattere [] e non l'intera stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top