none
Concatenar caracteres ASCII RRS feed

  • 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)
    terça-feira, 4 de agosto de 2009 13:32

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

    terça-feira, 4 de agosto de 2009 18:58
    Moderador
  • 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 Siga-me no Twitter!
    http://www.caioproiete.com
    terça-feira, 4 de agosto de 2009 14:15
    Moderador

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 Siga-me no Twitter!
    http://www.caioproiete.com
    terça-feira, 4 de agosto de 2009 14:15
    Moderador
  • 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

    terça-feira, 4 de agosto de 2009 18:58
    Moderador
  • 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


    Caio Proiete Siga-me no Twitter!
    http://www.caioproiete.com

    terça-feira, 4 de agosto de 2009 20:15
    Moderador
  • Caio,

    Realmente, a transformação é mais lenta. Pensei em praticidade mas não considerei performance. O cálculo é bem melhor.

    Valeu a discussão.

    Att.

    Ari C. Raimundo
    terça-feira, 4 de agosto de 2009 20:39
    Moderador
  • 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 ?
    quarta-feira, 5 de agosto de 2009 01:37
    Moderador
  • Valeu galera!!
    obrigado a todos que responderam.
    Caio e Ari, consegui dos dois modos, vlw!!!
    quarta-feira, 5 de agosto de 2009 12:03