Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

263
Views
¿Cómo convertir hexadecimal a decimal?

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 = 12406

Entonces, 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

. . .

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report

0

unsigned n; sscanf("0x3076", "%x", &n); printf("%u\n", n);
over 4 years ago · Santiago Trujillo Report

0

¡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!

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!