Converter um único caractere hex ao seu valor byte em C #
Pergunta
Isto irá converter caracteres 1 hex ao seu valor inteiro, mas as necessidades para a construção de um (sub) string.
Convert.ToInt32(serializedString.Substring(0,1), 16);
O .NET têm um valor built-in maneira de converter um único caractere hex ao seu byte (ou int, não importa) que não envolve a criação de uma nova string?
Solução
int value = "0123456789ABCDEF".IndexOf(char.ToUpper(sourceString[index]));
Ou ainda mais rápido (subtração de busca gama vs.), mas nenhuma verificação para a entrada ruim:
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');
}
Outras dicas
me corrigir se estou errado, mas você pode simplesmente usar
Convert.ToByte(stringValue, 16);
enquanto o stringValue representa um número hexadecimal? Não é isso o ponto do paramter base?
Strings são imutáveis, eu não acho que há uma maneira de obter o valor de byte substring do caractere no índice 0, sem criar uma nova seqüência
Claro que você pode obter o valor hexadecimal sem precisar criar outra string. Eu não tenho certeza do que ele vai realmente ganhar você, desempenho sábio, mas já que você perguntou, aqui está o que você solicitou.
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 você souber o valor hexadecimal é de apenas um byte em seguida, basta converter para um Int32 e depois lançar
var b = (byte)(Convert.ToInt32(serializedString, 16));
Encoding.UTF8.GetBytes( serializedString.ToCharArray(), 0, 1)
Mais barato poderia ser:
Encoding.UTF8.GetBytes( new char[]{ serializedString[0] }, 0, 1)
Isso só irá adicionar o caractere interessante para o char [] e não a seqüência inteira.