Autor Tema: como funciona esta formula?  (Leído 228 veces)

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

Desconectado johenrod

  • PIC16
  • ***
  • Mensajes: 121
como funciona esta formula?
« en: 08 de Abril de 2021, 18:30:54 »
Cordial saludo,, requiero de una ayuda para entender lo siguiente.
tengo unos datos en un arreglo
Code[14]; 0X02,0X30,0X39,0X30,0X30,0X36,0X32,0X39,0X39,0X32,0X39,0X44,0X42,0X03


al pasarlos por un for, me lee del 5 al 10 y al terminar me entrega lo siguiente
 0900629929DB
 6
 98
 1577
 25241
 403858
 6461737


quisiera saber las funciones que hay dentro del for, como logran extraer el numero"6461737"  lo único que logro entender es que pasa 4 posiciones a la izquierda cada lectura. gracias de antemano.

Código: C
  1. for(int i=5;i<11;i++)//
  2.     {
  3.       Num<<=4;    //
  4.         if(Code[i]>64)
  5.         {
  6.           Num+=((Code[i])-55);//
  7.         }
  8.         else
  9.         {
  10.           Num+=((Code[i])-48);//
  11.         }
  12.         Serial.println(Num);
  13.        
  14.     }    
  15.        Serial.println(Num);
« Última modificación: 08 de Abril de 2021, 18:33:03 por johenrod »

Desconectado Robert76

  • PIC18
  • ****
  • Mensajes: 380
Re:como funciona esta formula?
« Respuesta #1 en: 08 de Abril de 2021, 18:47:52 »
Hola, lo que hace la función es devolver un valor hexadecimal desde un dato que está en formato ASCII.

Desconectado johenrod

  • PIC16
  • ***
  • Mensajes: 121
Re:como funciona esta formula?
« Respuesta #2 en: 08 de Abril de 2021, 18:54:53 »
Citar
Robert76
Gracias por tu respueta.
porque da las opciones si es > o > que 64?
me podrían dar por favor un ejemplo del primer recorrido?

O en este punto, no logro hallar el valor.
Código: C
  1. Num+=((Code[i])-48);//
« Última modificación: 08 de Abril de 2021, 19:18:44 por johenrod »

Desconectado Robert76

  • PIC18
  • ****
  • Mensajes: 380
Re:como funciona esta formula?
« Respuesta #3 en: 08 de Abril de 2021, 22:11:21 »
Busca la tabla del código ASCII.
Chequea que caracteres están comprendidos entre 48 y 70?
Si luego imaginas un valor por ejem.code[]=67 y lo metes en la condición if, adónde bifurca?
Luego prueba a darle un valor digamos 60, que valor te da?
Si pruebas diferentes números.
El resultado será siempre entre 0 y 15.
O sea, contempla el rango HEX.
« Última modificación: 08 de Abril de 2021, 22:13:28 por Robert76 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8096
Re:como funciona esta formula?
« Respuesta #4 en: 08 de Abril de 2021, 22:22:09 »
Citar
me podrían dar por favor un ejemplo del primer recorrido?

Comienza desde el 6to elemento ( i = 5 )
Pregunta si es mayor a 64 decimal o que es lo mismo que 0x40 hexadecimal.
De ser mayor, le resta 55 ( 0x37 hexa) y si es 64 o menos, le resta solo 48 ( 0x30)

Code[5] 0X36
Code[6] 0X32
Code[7] 0X39
...
Code[10] 0X39

Primera vuelta:
Num es 0x0, al girar 4 lugares sigue en 0.
0x36 es 54 decimal, por lo tanto entra a la parte del else y solo le resta 48, es decir quedaria 0x06 en Num.

Segunda vuelta.
Luego se corre 4 lugares a la izquierda, es decir pasa de 0x06 a 0x60 para hacer lugar al otro numero.
Ahora recibe un 0x32, y sigue siendo menor que 64, por lo tanto le resta 0x30, quedando solo 0x02.
Se lo suma a Num, quedando ahora Num como 0x62

Tercera vuelta.
Luego se corre 4 lugares a la izquierda, es decir pasa de 0x62 a 0x620 para hacer lugar al otro numero.
Ahora recibe un 0x39, y sigue siendo menor que 64, por lo tanto le resta 0x30, quedando solo 0x09.
Se lo suma a Num, quedando ahora Num como 0x629

Etc...

Si observas ninguno de los números desde el 5 hasta el 10 supera los 64. Y como podes ver queda siempre el ultimo nibble.
Por lo tanto Num va a quedar como 0x629929 que pasado a decimal es: 6.461.737 y es el numero que ves.


La pregunta es ... ¿Por que hacer esto?
Por que no es lo mismo 0x9 que 0x39, uno es el numero 9 decimal, y el otro es una codificación bastante común que es digito ASCII '9'. Asi que una forma facil de pasar el ASCII a hexadecimal/decimal, es restarle 0x30.

¿Por que mayor que 64?
Por que 65 o 0x41 empiezan las letras en la codificacion ASCII, la 'A' es el 0x41

Te dejo una tabla ASCII


¿Por que te dijeron que era un conversor ASCII a hexadecimal?
Por que observa que no vuelve el numero decimal 629.929, sino que tenes el valor hexadecimal 0x62 9929  que es muy distinto.
Por eso no podria hablarse de una conversion ASCII a decimal.

¿Por que resta 55?
Como dijimos antes la idea era convertirlo en hexadecimal.
Si recibis un 0x41 ( 65 decimal, y 'A' en ASCII ) entonces por la logica del programa restas 55, y lo que te queda es 10 decimal, o que es lo mismo que 0xA hexa.
Es decir, convertiste una 'A' en ASCII en un valor hexadecimal 0xA.

Recorda que el hexadecimal tenes letras desde la A hasta la F, si recibe un valor por encima de estos valores ya no funciona el programa como debería, porque pasa a ocupar mas de un nibble (4 bits).
Si tuvieras estos valores en las posiciones 5 a 10:
"9977AB"

El resultado de tu programa sera 0x9977AB  = 10.057.643 decimal. Podes probarlo.

Desconectado Eduardo2

  • PIC18
  • ****
  • Mensajes: 473
Re:como funciona esta formula?
« Respuesta #5 en: 08 de Abril de 2021, 22:41:25 »
Tal vez asi se entienda mejor el significado de los números usados. 
(tener presente que en Code[] hay un string del número en hexadecimal)

Código: C
  1.         if(Code[i]>='A')  Num += Code[i]-'A'+10;
  2.         else              Num += Code[i]-'0'   ;
  3.  

Desconectado johenrod

  • PIC16
  • ***
  • Mensajes: 121
Re:como funciona esta formula?
« Respuesta #6 en: 09 de Abril de 2021, 14:16:38 »
huuf,,, excelente,,
Muchas gracias a todos por sus respuestas ya lo entendí, por fortuna acá en el foro hay personas muy "tesas"(que saben mucho)
por ultimo.. si no es mucho pedir,, a mi como a muchos se nos hace un lío saber como maneja el pic los datos entrantes, que si bien son binarios no sabemos a veces si vienen hex o ascci, si saben de un hilo que hable al respecto de este tema lo agradezco.

 ((:-))Gracias, aprendí mucho con las respuestas de todos.

Desconectado Robert76

  • PIC18
  • ****
  • Mensajes: 380
Re:como funciona esta formula?
« Respuesta #7 en: 09 de Abril de 2021, 16:07:52 »
Recuerda, cualquier procesador digital, sólo trabaja con ceros y unos(binarios)
Los sistemas numéricos, son sólo una representación.
Por ejem:

Octal es múltiplo de dos(poco usado)

Hexadecimal es múltiplo de dos (es muy usado porque comprende un nibble(4 bits)
Y de esa manera puedes usar cómodamente números muy gdes. Tan sólo agrupándolos de 4 en 4 bits.
Ejem. Si quieres representar en binario el número 65535
Se trata de 16bits
    1111111111111111
Ahora representar el mismo número en hex. equivale a:
                            FFFF

« Última modificación: 09 de Abril de 2021, 19:57:03 por Robert76 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8096
Re:como funciona esta formula?
« Respuesta #8 en: 09 de Abril de 2021, 16:51:23 »
Para agregar a lo que dijo Robert76

Usualmente sos vos el que debe saber en que se trabaja.

Por ejemplo para que veas la diferencia. El número

0x5A = 0101 1010

Puede ser:
- la letra 'Z' en codificacion ASCII
- el numero en si, es decir el decimal 90.
- el numero 0,7 en formato Q7
- 8 bits que indican el estado de alguna salida
- ETCETERA, puede ser lo que vos quieras que sea. Podría ser la codificación johenrod y eso es la letra 'A' para vos.

Te das cuenta que el mismo numero binario puede usarse de miles de formas.
Es por eso que uno debe ser consciente con lo que trabaja. Si usas TU propia codificacion entonces tanto el emisor como receptor deben usar la misma. Pero usualmente partimos por codificaciones estandar como lo es el ASCII y que C usa en sus strings.

PD y por si las dudas:

Que escribas en hexa 0x5A, 90 en decimal, no significa que sean distintos, es el mismo numero, solo que esta visto a traves de distintos "filtros" una para hexa, otro para decimal, ASCII, etc, solo que por debajo solo tenemos un binario.

Desconectado johenrod

  • PIC16
  • ***
  • Mensajes: 121
Re:como funciona esta formula?
« Respuesta #9 en: 10 de Abril de 2021, 10:11:50 »
Muchas gracias caballeros, valoro el tiempo y el conocimiento que nos comparten.
Ya teniendo estas bases, sera mas fácil comprender esto de la programación.


 

anything