Lenguaje C: Pasar de array de char a int

Veréis, tengo un búfer de la siguiente forma:

char buf[4];

es un búfer de 4 bytes, y quiero formar con esos 4 bytes un entero (int) de 32 bits.

De tal forma que si:
buf[0]=0x32
buf[1]=0x6e
buf[2]=0x01
buf[4]=0xe9

El entero resultante sea:

int entero = 0x326e01e9

Un saludo y muchas gracias, a ver si me podéis ayudar, que soy nuevo en esto de Linux y C.
Usa memcpy
De buffer a entero:

memcpy(&entero, &buffer, sizeof(int));

y de entero a buffer:

memcpy(&buffer, &entero, sizeof(int));
(mensaje borrado)
Muchísimas gracias.

Hago esto:

unsigned int entero;
memcpy(&entero, &buf, 4);
printf("\nNumero hexadecimal: %x", entero);
printf("\nNumero decimal: %d", entero);


El problema es que el primer printf me lo imprime correctamente, en hexadecimal, pero el segundo printf me lo imprime como un número negativo, cuando yo le he dicho claramente que quiero que sea un entero decimal sin signo (o sea, positivo).

¿En qué me estoy equivocando?
Yoshi's escribió:Muchísimas gracias.

Hago esto:

unsigned int entero;
memcpy(&entero, &buf, 4);
printf("\nNumero hexadecimal: %x", entero);
printf("\nNumero decimal: %d", entero);


El problema es que el primer printf me lo imprime correctamente, en hexadecimal, pero el segundo printf me lo imprime como un número negativo, cuando yo le he dicho claramente que quiero que sea un entero decimal sin signo (o sea, positivo).

¿En qué me estoy equivocando?


En que no le has dicho en ningún momento al printf que quieres que tu variable se muestre como un entero sin signo.
man 3 printf escribió:o, u, x, X The unsigned int argument is converted to unsigned octal (o), unsigned decimal (u), or unsigned hexadecimal (x and X) notation.


Y por cierto, a no ser que estés compilando bajo una arquitectura big-endian lo que has puesto arriba para llenar el array no te va a funcionar ya que debes llenarlo al revés.
Muchísimas gracias, era eso justo lo que necesitaba.

Y ahora una última cosa, creo que Linux tiene un sistema de tiempo, que te dice la fecha actual en función del número de segundos que pan pasado desde el 1 de enero de 1970.

La pregunta es, si yo tuviera dicho número de 32 bits en un int, ¿existe alguna biblioteca de C que te convierta ese entero en una fecha entendible por el hombre? (por ejemplo: 12 Jan 2021 13:45 GTM). Obviamente lo podría hacer yo a mano, pero si existe algo ya programado (imagino que sí), me vendría estupendamente.

Un saludo.
Yoshi's escribió:Muchísimas gracias, era eso justo lo que necesitaba.

Y ahora una última cosa, creo que Linux tiene un sistema de tiempo, que te dice la fecha actual en función del número de segundos que pan pasado desde el 1 de enero de 1970.

La pregunta es, si yo tuviera dicho número de 32 bits en un int, ¿existe alguna biblioteca de C que te convierta ese entero en una fecha entendible por el hombre? (por ejemplo: 12 Jan 2021 13:45 GTM). Obviamente lo podría hacer yo a mano, pero si existe algo ya programado (imagino que sí), me vendría estupendamente.

Un saludo.


Dale un vistazo a asctime/strftime (y tambien a localtime/gmtime).

Nota: recuerda que dependiendo de la arquitectura time_t puede ser de 32 o 64 bits (y bajo otros S.O. ni siquiera tiene por que ser un entero de 32/64 bits), por lo que asumir que un int de 32 bits puede representar una fecha valida no necesariamente es correcto en todos los casos.
Lo que he hecho (sin tener ni idea) es esto:

int time;

char fecha[80];
struct tm *ts = localtime(&time);
strftime(fecha, sizeof(fecha), "%a %d-%m-%Y %H:%M:%S %Z", ts);
printf("%s\n", fecha);

Cualquier otra sugerencia es bienvenida.
Yoshi's escribió:Lo que he hecho (sin tener ni idea) es esto:

int time;

char fecha[80];
struct tm *ts = localtime(&time);
strftime(fecha, sizeof(fecha), "%a %d-%m-%Y %H:%M:%S %Z", ts);
printf("%s\n", fecha);

Cualquier otra sugerencia es bienvenida.


Pensé que ya tenias una fecha valida para empezar, dado que localtime solo acepta una valida puedes hacer algo como esto:
#include <stdio.h>
#include <time.h>

int main() {
    time_t t;

    char fecha[80];
    time(&t);
    struct tm *ts = localtime(&t);
    strftime(fecha, sizeof(fecha), "%a %d-%m-%Y %H:%M:%S %Z", ts);
    printf("%s\n", fecha);
}
Sí, lo que he puesto me funciona perfectamente. Tengo la hora válida y ya consigo que me la imprima.
9 respuestas