FórumGdH

Página Inicial do Guia do Hardware

Registrar FAQ Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Voltar   FórumGdH > Profissional > Programação, scripts, web e banco de dados
Bem-vindo ao FórumGdH
Não se esqueça de se registrar, é grátis . Nós temos 754.038 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.

Resposta
 
Opções do Tópico
Antigo 22-09-2006, 8:55   #1 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão Conversão Hexa p/ Decimal em C (Resolvido)

Bom dia galera to me matando aqui e não consigo achar o problema se alguem pode me ajudar agradeço....

o laço faz o seguinte recebe um string contendo valores em Hexa separa de dois em dois tranforma em decimal e soma...

Ex: String -> AC1025E3C9AB
AC+10+25+E3+C9+AB

ele deveria pegar AC tranformar em decimal e guardar em uma variavel e assim sucessivamente mas

Código:
for(i=1,checksun=0;i<strlen(buffer)-2;i+=2){ /*temp[0]=buffer[i]; temp[1]=buffer[i+1]; temp[2]=0; checksun+=hexToInt(temp);*/ //printf("decimal -> %d, caracter -> %c\n\n",buffer[i],buffer[i]); printf("Hexa : %c%c\n",buffer[i],buffer[i+1]); conv=0; if((buffer[i]>=48)&&(57<=buffer[i])) conv+=((buffer[i]-48)*16); else if ((buffer[i]>=65)&&(70<=buffer[i])) conv+=((buffer[i]-55)*16); else printf("Pego lixo!!!\n\n\n"); if((buffer[i+1]>=48)&&(57<=buffer[i+1])) conv+=(buffer[i+1]-48); else if ((buffer[i+1]>=65)&&(70<=buffer[i+1])) conv+=(buffer[i+1]-55); else printf("Pego lixo!!!\n\n\n"); printf("Decimal: %d\n\n",conv); checksun+=conv; }
se alguem souber como fazer ao contrario DECIMAL -> HEXA da msm forma como acima agradeço não consegui pensar em uma logica para isso ainda...


Obrigado desde ja...
RportM está offline   Responder com Quote
Antigo 22-09-2006, 9:39   #2 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

RportM ...

Fiz um exemplo rápidinho de conversão para vc, analiza ai.


Código:
#include <stdio.h> #include <string.h> int main() { // Conversão de números inteiro hexa para decimal // Atenção: os número hexa do exemplo são minúsculos se colocar maiúculos irá gerar erro. char*Hexa = { "0123456789abcdef" }; // tabela de conversão para hexa char*Valor = "ffff"; // Variável texto a ser convertida int Tamanho = strlen(Valor); // Tamanha da variável a ser convertida int Resultado = 1; // Vairável que irá conter o resultado int Posicao = 0; // Posição de leitura do caracter da variável a ser convertida int PosTabHex_1; // Essa variael irá conter a posição do primeiro número hexa na tabela int PosTabHex_2; // Essa variael irá conter a posição do segundo número hexa na tabela int Contador; // Contador do laço for do { // Passo 1 - Achar a posição do primeiro valor hexa na tabela for( Contador = 0; Contador < 16; Contador++) { if( Valor[Posicao] == Hexa[Contador] ) // Acha a posição do o primeiro número hexa na tabela hexa { PosTabHex_1 = Contador+1; } if( Valor[Posicao+1] == Hexa[Contador] ) // Acha a posição do o segundo número hexa na tabela hexa { PosTabHex_2 = Contador+1; } } // Passo 2 - Calcular o valor do PAR hexa e adicionar no resultado Resultado = Resultado * ( PosTabHex_1 * PosTabHex_2 ); // Passo 3 - Próximo par Posicao = Posicao + 2; } while ( Posicao < Tamanho ); // Sair caso atinja o final da variável /* OBS: O valor da variável resultado é 1 no início, por causa da multiplicação, multiplicar qualquer valor por zero é igual a zero. Então irei subtrair no final 1 da variável zero. */ Resultado = Resultado - 1; printf( "\n\nO número hexa %s é igual ao número inteiro %d\n\n", Valor, Resultado); }
Creio que fazer o contrário dessa função seja fácil com esse exemplo, tente ai e poste o resultado !

:mrgreen:
FabianoTraple está offline   Responder com Quote
Antigo 22-09-2006, 9:46   #3 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

FabianoTraple

Vc poderia dar uma olhada no meu codigo, não consigo entender o pq ele não esta entrando dos if's

para fazer ao contrario como so utilizarei duas casas escrevi esse codigo
Código:
n1 = (total/16) % 16; n2 = total % 16; sai[0]=n1+(48*(n1>=0&&n1<=9))+(55*(n1>9&&n1<16)); sai[1]=n2+(48*(n2>=0&&n2<=9))+(55*(n2>9&&n2<16)); sai[2]=0;
RportM está offline   Responder com Quote
Antigo 22-09-2006, 10:18   #4 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

RportM ...

De ode vc tirou o números 48, 55, eles são os códigos ASC das letras ?

:roll:
__________________
umbrsuporte@hotmail.com
FabianoTraple está offline   Responder com Quote
Antigo 22-09-2006, 10:22   #5 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

Isso...
Vc tentou compilar o meu programa?
RportM está offline   Responder com Quote
Antigo 22-09-2006, 10:34   #6 (permalink)
FabianoTraple
Veterano
 
Avatar de FabianoTraple
 
Registrado em: Jun 2006
Mensagens: 1.179
Reputação: 13 FabianoTraple está indo no caminho certo
Padrão

FabianoTraple...

Não tentei compilar o seu não...

Dei uma olhada por cima e não consegui compreender a sua estrutura, então, viz um modelo rapidinho para vc comparar a sua estrutura com a minha, veja que eu detalhei passo a passo para facilitar a comparação...

:mrgreen:
__________________
umbrsuporte@hotmail.com
FabianoTraple está offline   Responder com Quote
Antigo 22-09-2006, 10:42   #7 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

de uma olhada nos meu if's para ver se esta errado estou usando os valores da tabel ASC mas meus if estam funcionando eu naum sei o pq....

dei uma resumida neles para vc ver

Código:
n1=70; n2=70; if((n1 >= 48)&&(57 <= n1)){ printf("Passou no 1 if\n"); } if ((n1>=65)&&(70<=n1)){ printf("Passou no 2 if\n"); } if((n2 >= 48)&&(57 <= n2)){ printf("Passou no 3 if\n"); } if ((n2>=65)&&(70<=n2)){ printf("Passou no 4 if\n"); }
ele esta entrando em todos os if's, não estou entendendo o pq...
RportM está offline   Responder com Quote
Antigo 22-09-2006, 10:43   #8 (permalink)
Zet0
Newbie
 
Registrado em: Sep 2006
Mensagens: 16
Reputação: 0 Zet0 está indo no caminho certo
Padrão

RpotM

De uma olhada nas condições do teus if's. Algumas comparações estão com sinal invertido...
Zet0 está offline   Responder com Quote
Antigo 22-09-2006, 10:47   #9 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

quais?
RportM está offline   Responder com Quote
Antigo 22-09-2006, 11:02   #10 (permalink)
Zet0
Newbie
 
Registrado em: Sep 2006
Mensagens: 16
Reputação: 0 Zet0 está indo no caminho certo
Padrão

Todos...

Vc está comparando assim:

Código:
if((n1 >= 48)&&(57 <= n1))
Deixando as variáveis do mesmo lado em ambas as comparações temos:

Código:
if((n1 >= 48)&&(n1 >= 57))
E eu acho que não era a intenção ter essa comparação
Zet0 está offline   Responder com Quote
Antigo 22-09-2006, 12:02   #11 (permalink)
RportM
Novo Membro
 
Registrado em: Dec 2005
Mensagens: 129
Reputação: 13 RportM está indo no caminho certo
Padrão

Brigado Zet0 erro idiota o meu
RportM está offline   Responder com Quote
Antigo 22-09-2006, 17:58   #12 (permalink)
jqueiroz
Highlander
 
Avatar de jqueiroz
 
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 9
Mensagens: 87.724
Reputação: 778 jqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputação
Padrão

Citação:
De ode vc tirou o números 48, 55, eles são os códigos ASC das letras ?
Dica...

Em C/C++, você tanto pode usar o código ASCII da letra, quanto a própria letra. Esses códigos, então, são equivalentes:

Código:
if((n1 >= 48)&&(57 <= n1)){ printf("Passou no 1 if\n"); } if ((n1>=65)&&(70<=n1)){ printf("Passou no 2 if\n"); } if((n2 >= 48)&&(57 <= n2)){ printf("Passou no 3 if\n"); } if ((n2>=65)&&(70<=n2)){ printf("Passou no 4 if\n");
Código:
if((n1 >= '0')&&('9' <= n1)){ printf("Passou no 1 if\n"); } if ((n1>='A')&&('F'<=n1)){ printf("Passou no 2 if\n"); } if((n2 >= '0')&&('9' <= n2)){ printf("Passou no 3 if\n"); } if ((n2>='A')&&('F'<=n2)){ printf("Passou no 4 if\n");
__________________
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2010 JQueiroz/FGdH
CCNP: √ ² CCSI: □ | Conheça o Novo Bebuns
jqueiroz está offline   Responder com Quote
Resposta


Opções do Tópico

Regras de Mensagens
Você não pode criar tópicos
Você não pode postar respostas
Você não pode anexar arquivos
Você não pode editar suas mensagens

Código vB está Ligado
Smiles estão Ligado
Código [IMG] está Ligado
Código HTML está Desligado
Ir para...


Horários baseados na GMT -3. Agora são 10:53.