Autor Tema: string to hex to decimal  (Leído 2945 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
string to hex to decimal
« en: 21 de Septiembre de 2018, 02:31:21 »
Hola,tengo una duda.... necesito pasar un string a hex y luego mostrarlo en decimal

string[]="04C65D12FF3880"
decimal que debo mostrar valor=1344002959816832

Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:string to hex to decimal
« Respuesta #1 en: 21 de Septiembre de 2018, 08:57:44 »
En un microcontrolador eso es MUCHO, ¿donde utilizas un numero de 64 bits? en un microcontrolador de 8 bits ?
En una PC es poco y simple.
No se que microcontrolador lo pensas usar, si es un micro de 32bits y seguramente sea mas facil.

Estuve observando al menos en XC8 no existe un tipo que pueda almacenar esa cantidad. Lo que no quiere decir que no se pueda almacenar, sino que luego va a ser complejo para pasar a "decimal" (en realidad una conversion a ASCII del decimal creo que buscas).

podrias definir una estructura para mantener los datos, uno para la parte alta y uno para la baja. cada una de estas partes podria ser una union de una variable de 32bits y un array de 4 elementos.
Luego comenzar desde el final del string y preguntarte si la letra que tenes es un numero o es de A a la F. de alli restar '0' o 'F' dependiendo el caso, y tambien realizar un SWAP sobre tu variable destino, como para ir cargando byte a byte tu numero.

Terminado este paso ya tendrias tu numero en hexa (dejo de ser ASCII) en esa estructura.

Ahora todo depende que queres hacer con esto... vos decis que debes mostrar, y yo me pregunto a donde debes mostrar. Un LCD?, una PC ?
Si es un LCD, vas a tener que pasar ese numero a BCD. Y como esta dividido de esa forma al no tener un tipo de 64 bits, no vas a poder dividir, y tal ves el mejor acercamiento sea restar.
Aun asi son DEMASIADOS numeros para el micro de 8bits.

Desconectado lycans2005

  • PIC10
  • *
  • Mensajes: 23
Re:string to hex to decimal
« Respuesta #2 en: 21 de Septiembre de 2018, 11:53:58 »
....

Quiero hacer esto:
Código: C
  1. //02 |  8/10/16ASCII Data Characters |  2 bytes Checksum |  03
  2. //              Example: card number: 62E3086CED
  3. // CHECKSUM: (62H) XOR (E3H) XOR (08H) XOR (6CH) XOR (EDH)=08H
  4.  
  5. Pero la tarjeta que leo es de 16byte           >>   04C65D12FF3880CA
  6. data= 04C65D12FF3880
  7. Cheksum=CA
Muchas gracias por la respuesta... hace un tiempo me ayudaste con este código que funciona perfecto para 8byte...

Código: C
  1. //*****************************************************************************
  2. #DEFINE SIZE_UID   10                // Serial Buffer Size
  3. /***************************************************************/
  4. //  VARIABLES
  5. /***************************************************************/
  6.  
  7. //Definicion de union
  8. union IDcard {
  9.         int8 Enbytes[4];
  10.         int16 EnHWord[2];
  11.         int32 EnWord;
  12. };
  13.  
  14. union IDcard IDcard;
  15. char UID[SIZE_UID];                      // ID 125 K
  16. char c=0x00;  
  17. int isCard=0x00;
  18. int counter_read2=0;
  19.  
  20. #INT_RDA2
  21. void RDA_isr2();               // Serial ISR used
  22. //!************** SERIAL BUFFER ISR *******************************************
  23. #int_RDA2                                                              // Interrupción por recepción de datos UART2
  24. void RDA_isr2(void) {                                                  // Interrupción recepción serie USART
  25.    c=0x00;                                                             // Inicializo caracter recibido                    
  26.    c=getc(RFID);                                                       //
  27.          UID[counter_read2++]=c;                                       //
  28.           if(counter_read2==5) {                                       // 00-00-00-00-'cheksum'
  29.                if((UID[0] ^ UID[1] ^ UID[2] ^ UID[3] ^ UID[4]) == 0){  // Valido el cheksum
  30.                   IDcard.Enbytes[0] = UID[3];                          // 4  
  31.                   IDcard.Enbytes[1] = UID[2];                          // 3
  32.                   IDcard.Enbytes[2] = UID[1];                          // 2
  33.                   IDcard.Enbytes[3] = UID[0];                          // 1
  34.                   counter_read2=0x00;                                   // Reincio contador
  35.                   isCard=1;                                                    // Tarjeta presente
  36.                }
  37.           else{                                                        //
  38.                memset(UID,NULL,sizeof(UID));                           // Limpiar buffer
  39.                counter_read2=0x00;                                     // Reincio contador
  40.                isCard=0x00;                                            // Tarjeta invalida
  41.            }
  42.           }
  43. }
  44.  
  45. fprintf (debug,"[%010Lu]\r\n",IDcard.EnWord);               // [0003044755]

Intente ponerlo hasta 15 pero no funciona.
Solo busco retransmitir ese IUD en su forma decimal por  sms o bluetooth
Para detectar el IUD lo hago asi
Código: C
  1. /***************************************************************/
  2. //  FUNCIONES
  3. /***************************************************************/
  4. #INT_RDA2
  5. void RDA_isr2();               // Serial ISR used
  6. //!************** SERIAL BUFFER ISR *******************************************
  7. #int_RDA2                                                              // Interrupci recepci datos UART1
  8. void RDA_isr2(void) {                                                  // Interrupciecepcierie USART
  9.            bufferByte = getchar(port2);        
  10.  
  11.         if (bufferByte == 0x03){                              // End
  12.             moduleResonseBuffer[moduleBufferIndex] = 0x00;    // Add Null terminator
  13.             messageReady= 1;
  14.             moduleBufferIndex = 0;                            // Prepare index for next message
  15.         }
  16.         else                                                  // Start
  17.         {
  18.             moduleResonseBuffer[moduleBufferIndex++] = bufferByte; // Add Byte to Buffer
  19.  
  20.         }
  21. }

y en el  main...

Código: C
  1. while(1){  
  2.       if (messageReady){
  3.           messageReady=0;
  4.            fprintf (port1,"IUD:%s\r\n",moduleResonseBuffer);               // IUD:
  5.     }
         
« Última modificación: 21 de Septiembre de 2018, 12:12:51 por lycans2005 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:string to hex to decimal
« Respuesta #3 en: 21 de Septiembre de 2018, 12:22:27 »
No entiendo porque tenes 2 usuarios, cvargcal y lycans2005

No te imaginas lo confuso que es estar hablando con quien se cree que es una persona y luego viene otra persona de golpe a continuar la conversación que tuviste con otra persona.
Y no solo las 2 cuentas, sino que ademas hay 2 temas casi con lo mismo.

http://www.todopic.com.ar/foros/index.php?topic=49023

Resumen: Usa una sola cuenta. Y si el tema sigue siendo el mismo, seguilo en el mismo hilo


Ahora a tu problema, La pregunta pregunta del millon es:
¿ Para que queres pasarlo a decimal ?

No vale la pena hacerlo, mostra el ID en hexadecimal y listo. Va a ser extra complicado y consumidor de tiempo del micro solo por querer mostrarlo en decimal.

Desconectado lycans2005

  • PIC10
  • *
  • Mensajes: 23
Re:string to hex to decimal
« Respuesta #4 en: 21 de Septiembre de 2018, 12:59:12 »
...

Si tienes razón, es mi navegador... no me di cuenta con que usuario hice el post.... pero ya inicie con este... no volveré hacer un post con este usuario.

mmm bueno, quería mostrar el numero "plano" como ID:123456789 ... pero no dimensione lo complicado que puede ser....

Muchas gracias por la respuesta.

Validar el checksum desde el micro es complicado también, para saber si tengo el IUD correcto.
« Última modificación: 21 de Septiembre de 2018, 13:22:42 por lycans2005 »


 

anything