Conversione da uint32_t to Big endian

di il
1 risposte

Conversione da uint32_t to Big endian

Ciao, questa è la consegna dell'esercizio:
Creare i file ip.h e ip.c che consentano di utilizzare la seguente funzione:

extern uint32_t *leggi_indirizzi_ip(const char *filename, size_t *size);

La funzione riceve il nome di un file da aprire in modalità lettura tradotta (testo), e
un puntatore ad un size_t. Il file contiene una sequenza di righe contenenti indirizzi IP
in formato testo, ovvero quattro numeri interi da 0 a 255 separati da tre punti. Ad
esempio:

127.0.0.1?
10.0.42.3?
78.15.46.23?

La funzione deve convertire il file in una sequenza allocata dinamicamente di numeri
interi a 32 bit in big endian. Ogni numero è formato dai 4 byte corrispondenti ai valori
degli indirizzi IP. Nel caso precedente, la funzione dovrebbe allocare 3 interi a 32 bit,
che contengano i valori 0x7F000001, 0x0A002A03, 0x4E0F2E17. La variabile puntata da size
deve essere impostata al numero di valori letti.

Se il file è vuoto o non esiste, se contiene numeri non compresi nell’intervallo
rappresentabile in un byte o se contiene linee incomplete, la funzione ritorna NULL e
imposta size a 0.

Questo è il mio file.h:
#if !defined IP_H
#define IP_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>

extern uint32_t *leggi_indirizzi_ip(const char *filename, size_t *size);


#endif
questo è il mio main.c:
#include "ip.h"

int main(){

	size_t *size;
	uint32_t ris = leggi_indirizzi_ip("leggo.txt", &size);

	return ris;

}
questo è il mio file.c:
#include "ip.h"

uint32_t *leggi_indirizzi_ip(const char *filename, size_t *size){

	FILE *f = fopen(filename, "rt");
	if (f == NULL){
		*size = 0;
		return NULL;
	}

	uint32_t n1, n2, n3, n4;

	while (1){
		if (fscanf(f, "%u.%u.%u.%u", &n1, &n2, &n3, &n4) != 4){
			break;
		}



	}


}
In questo problema faccio una semplice lettura e poi realloco tranquillamente in memoria.. però mi sono bloccato e non riesco ad andare avanti. Il mio problema sta nel fatto che non so proprio come si faccia a convertire in Big endian. Qualcuno lo sa?

1 Risposte

  • Re: Conversione da uint32_t to Big endian

    Didatticamente.
    
    union NomeAdatto {
        uint32_t value;
        uint8_t tokens[4];
    };
    
    crei due istanze della union. Nella prima inserisci in value il valore da convertire, ritrovandolo spezzettato in tokens.
    Nella seconda istanza copi in ordine inverso i tokens della prima e nel value ti ritrovi il valore in big endian.
    (poi inizi a pensare se in effetti servano due istanze o puoi fare tutto con una sola).
Devi accedere o registrarti per scrivere nel forum
1 risposte