Преобразовать один шестнадцатеричный символ в его значение байта в C # - PullRequest
4 голосов
/ 01 августа 2009

Это преобразует 1 шестнадцатеричный символ в его целочисленное значение, но необходимо создать (под) строку.

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

Есть ли в .NET встроенный способ преобразования одиночного шестнадцатеричного символа в его байтовое (или int, неважно) значение, которое не требует создания новой строки?

Ответы [ 5 ]

16 голосов
/ 01 августа 2009

Поправьте меня, если я не прав, но вы можете просто использовать

Convert.ToByte(stringValue, 16);

до тех пор, пока stringValue представляет шестнадцатеричное число? Разве это не точка базового параметра?

Строки являются неизменными, я не думаю, что есть способ получить значение байта подстроки char в индексе 0 без создания новой строки

16 голосов
/ 01 августа 2009
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');
}
2 голосов
/ 01 августа 2009

Конечно, вы можете получить шестнадцатеричное значение без необходимости создавать другую строку. Я не уверен, что это действительно принесет вам пользу в плане производительности, но раз вы спросили, вот что вы просили.

    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;
            }
        }
    }
1 голос
/ 01 августа 2009

Если вы знаете, что шестнадцатеричное значение является только байтом, просто преобразуйте его в Int32 и затем приведите

var b = (byte)(Convert.ToInt32(serializedString, 16));
0 голосов
/ 01 августа 2009
Encoding.UTF8.GetBytes( serializedString.ToCharArray(), 0, 1)

Дешевле может быть:

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

Это добавит только интересный символ к символу [], а не всю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...