Usuário com melhor resposta
Concatenar caracteres ASCII

Pergunta
-
Bom dia a todos!!
Pessoal, meu problema eh o seguinte:
Tenho um vetor (tipo byte) de duas posições - vetor[2]
Na primeira posição vai um caractere ASCII (é representado em HEX), ex: vetor[0] = 0x32 //codigo HEX para o caractere 2.
E na segunda posição 0x38 // codigo HEX para o caractere 8.
Agora tenho que guardar em uma variavel de tipo int o valor 28 (2 de 0x32 e 8 de 0x38).
Alguém poderia me dizer como fazer isso?
Desde já agradeço.
Desculpe pelos erros de portugues x)
Respostas
-
Oi Caio,
Acredito que o Tiago está certo.
0x32 (hexa) = 50 (decimal) = código ASCII para '2'
0x38 (hexa) = 56 (decimal) = código ASCII para '8'
Não seria mais fácil usar o método GetString da classe ASCII e depois transformar a string para int ?
Ex:
byte[] b = new byte[] { 0x32, 0x38 };
string str = ASCIIEncoding.ASCII.GetString(b);
int valor = int.Parse(str);
Console.WriteLine(valor);
Att.
Ari C. Raimundo
- Sugerido como Resposta C. Augusto Proiete [MVP]Moderator terça-feira, 4 de agosto de 2009 20:17
- Marcado como Resposta Tiago Capoani quarta-feira, 5 de agosto de 2009 12:04
-
Olá Tiago,
Não sei se entendi sua pergunta... Se o seu vetor é de byte, então a informação é gravada mesmo em byte... Não em sua representação hexadecimal..
De qualquer forma, partindo do princípio que você tem os números 2 e 8 e cada um dos elementos do array, para juntá-los, basta multiplicar o primeiro elemento por 10, e somar com o segundo elemento... Algo como:
byte[] vetor = new byte[2]; vetor[0] = 2; vetor[1] = 8; // [2 * 10] = 20 | [20 + 8] = 28 int valor = (vetor[0] * 10) + vetor[1];
Abraços,
Caio Proiete
Caio Proiete
http://www.caioproiete.com- Editado C. Augusto Proiete [MVP]Moderator terça-feira, 4 de agosto de 2009 20:17
- Sugerido como Resposta C. Augusto Proiete [MVP]Moderator terça-feira, 4 de agosto de 2009 20:17
- Marcado como Resposta Tiago Capoani quarta-feira, 5 de agosto de 2009 12:04
Todas as Respostas
-
Olá Tiago,
Não sei se entendi sua pergunta... Se o seu vetor é de byte, então a informação é gravada mesmo em byte... Não em sua representação hexadecimal..
De qualquer forma, partindo do princípio que você tem os números 2 e 8 e cada um dos elementos do array, para juntá-los, basta multiplicar o primeiro elemento por 10, e somar com o segundo elemento... Algo como:
byte[] vetor = new byte[2]; vetor[0] = 2; vetor[1] = 8; // [2 * 10] = 20 | [20 + 8] = 28 int valor = (vetor[0] * 10) + vetor[1];
Abraços,
Caio Proiete
Caio Proiete
http://www.caioproiete.com- Editado C. Augusto Proiete [MVP]Moderator terça-feira, 4 de agosto de 2009 20:17
- Sugerido como Resposta C. Augusto Proiete [MVP]Moderator terça-feira, 4 de agosto de 2009 20:17
- Marcado como Resposta Tiago Capoani quarta-feira, 5 de agosto de 2009 12:04
-
Oi Caio,
Acredito que o Tiago está certo.
0x32 (hexa) = 50 (decimal) = código ASCII para '2'
0x38 (hexa) = 56 (decimal) = código ASCII para '8'
Não seria mais fácil usar o método GetString da classe ASCII e depois transformar a string para int ?
Ex:
byte[] b = new byte[] { 0x32, 0x38 };
string str = ASCIIEncoding.ASCII.GetString(b);
int valor = int.Parse(str);
Console.WriteLine(valor);
Att.
Ari C. Raimundo
- Sugerido como Resposta C. Augusto Proiete [MVP]Moderator terça-feira, 4 de agosto de 2009 20:17
- Marcado como Resposta Tiago Capoani quarta-feira, 5 de agosto de 2009 12:04
-
Olá Ari,
É verdade. Não li o ASCII e ele chegou a mencionar... Como o último número coincidia com os números que ele queria (3[2] e 3[8]), fiz uma confusão geral.
Com relação ao método GetString, concordo que fica mais fácil de implementar (e de ler o código), principalmente se o array tiver um tamanho dinâmico. O que me incomoda nessa solução, é que além de ser muito mais lento, estamos a pegar algo que já é número, converter para string, para depois converter de volta para número, quando podíamos resolver com uma expressão matemática simples...
É a mesma história das casas decimais truncadas sem arredondamento (veja abaixo)... A solução mais usada é sempre converter para string, pegar a parte que interessa e converter de volta para número, quando um simples cálculo poderia resolver tudo uma vez que se tratam de números.
Desprezar Arredondamento
http://social.msdn.microsoft.com/forums/pt-BR/vscsharppt/thread/6ae79c1c-b1ec-4814-bbc8-fbbc4f24f74a/
Abraços,
Caio Proiete
-
-
ah.... se o caso é sempre a tabela ascii.... (tentando lembrar das maluquices do Delphi... perai)
nao lembro de cor... mas assumindo que 48 = '0' e 58 = '9'
int result = 0;
int mult = 1;
foreach(byte item in vetorBytes) {
if (item < 48 || item > 58) throw new Exception("Caracterer Invalidos");
result += (item - 48) * mult;
mult = mult * 10;
}
What would Brian Boitano do ? -