Tengo diferentes datos hexadecimales que vienen y se almacenan en un registro de tipo entero.
Cuando uso fprint puedo ver lo siguiente:
0x3076 0x307c . . .Sin embargo, me gustaría mostrar una versión decimal de los datos hexadecimales mencionados anteriormente de la siguiente manera.
12406 12412 . . .En teoría, digamos que para el primer valor haces lo siguiente para convertirlo a decimal.
(6* 16^0)+(7 * 16^1)+(0*16^2)+(3*16^3)=6 + 112+ 0 + 12288 = 12406Entonces, SI tengo la versión basada en caracteres de "0x3076" y también, SI puedo obtener cada uno de los caracteres 6 - 7 - 0 - 3, ¡puedo calcular la cantidad decimal!
Entonces, decidí dividir "3076" entre 1000. Se esperaba que obtuviera 3, ¡pero obtuve DOS caracteres en su lugar! sin embargo, si pude obtener 3 para el resto de "307c", no puedo obtener "C". ¡Si fuera decimal, esto podría funcionar, no hexadecimal!
Además, probé el comando " strtol ". Como uso Cygwin para compilar mi código, ¡no estoy seguro de dónde está el error! ¿Qué hice mal?
¡Entonces, solo necesito encontrar una manera de sacar CADA carácter ÚNICO de los datos HEX!
¿Alguna idea, por favor?
PD
Aquí está mi código para ayudarte a darme una idea.
int get_readings(int source, int phase, int max_tries) { uint8_t buf[MAX_IEC1107_MSG_BODY]; uint8_t inbuf[MAX_IEC1107_MSG_BODY]; int inlen; uint8_t *s; int32_t value; int status; double voltage; double current; double active_power; double reactive_power; double apparent_power; double power_factor; double frequency; s = buf; *s++ = HOST_CMD_GET_READINGS_PHASE_1 + phase; *s++ = 0x00; if (max_tries != 1) meter_set_max_tries(&emeter[source].meter_msg, max_tries); if (meter_exchange(&emeter[source].meter_msg, buf, 2, inbuf, &inlen) && inbuf[1] != 0xFF) { emeter[source].no_response = FALSE; s = inbuf; /* Get current readings */ value = (s[3] << 8) | s[2]; fprint(stderr, "value:" %p\n, value); // this give me HEX code. . .
Al leer una cadena que representa un número en hexadecimal, use strtol() para convertirlo en un largo. Luego, si desea imprimir el número en decimal, use printf() con un especificador de formato %d .
char num[]="0x3076"; long n = strtol(num, NULL, 16); printf("n=%ld\n", n); // prints 12406 Una vez que lea las cadenas como largos usando strtol y opere en los largos, las matemáticas deberían funcionar por sí solas.
unsigned n; sscanf("0x3076", "%x", &n); printf("%u\n", n);¡Solo con la siguiente línea pude resolver el problema!
fprintf(stderr, "Voltage: %.2f\n", value/100.00);¡El valor se mostró como HEX ya que solía usar %p! ¡Entonces cambié a x! y como necesito tener 124.06 no 12406, en otras palabras 2 puntos decimales, ¡agregué .2f!
¡Gracias a todos!