PDA

View Full Version : questione di dati (in C)


agus83
12-11-2007, 12:52
Ciao a Tutti,
vi pongo un mio problema su un programma in linguaggio C.
Ecco la situazione:
una funzione riceve un pacchetto (nel caso SRTP) tramite * void
-> void funzione(void *pkt)

Questo pacchetto è stato creato facendo memcpy di diversi campi (stringhe,interi). Non è dunque una struttura vera e propria,ma una serie di byte. Io dovrei prendere il valore di un determinato campo, che nello specifico è un unsigned int quando è stato copiato. So le posizioni di inizio dei singolo campi (#byte),ma nn so come ricavare il numero e porlo nella mia variabile. Grazie Mille
:)

trallallero
12-11-2007, 14:25
se ho capito bene:
memcpy( &Variabile, buffer, sizeof(Variabile) );

dove buffer è ovviamente la posizione del singolo campo

agus83
12-11-2007, 14:41
esatto,cosi avevo fatto io (sommando a buffer l'offest necessario). Purtroppo pero' sembra non funzionare...
Ho fatto delle prove,ma inconcludenti->

memcpy(pkt,stringa,sizeof(stringa));
printf("%s ",pkt,sizeof(stringa)); -> LO VISUALIZZA PERFETTO
memcpy(pkt+sizeof(stringa),&(codice),sizeof(codice)); -> 'CODICE' è UN INT

memcpy(&index,pkt+sizeof(stringa),sizeof(index));
printf(" ->%d\n",index); -> NULLA PURTROPPO.


Help Me!!!

trallallero
12-11-2007, 14:49
c'è un vero casino nel tuo codice ...

memcpy(pkt,stringa,sizeof(stringa));
la destinazione è a sinistra (come in tutte le funzioni standard del C)
quindi copi da stringa a pkt per lunghezza stringa ? :mbe:

printf("%s ",pkt,sizeof(stringa)); -> LO VISUALIZZA PERFETTO
passi 2 parametri alla printf ma ne visualizzi solo uno

memcpy(pkt+sizeof(stringa),&(codice),sizeof(codice)); -> 'CODICE' è UN INT
quà si capisce che hai invertito dest e source. Codice va a sinistra perchè è la destinazione

agus83
12-11-2007, 15:23
Allora,
con -> memcpy(pkt,stringa,sizeof(stringa)); voglio appunto avere come destinazione pkt.
Nella printf avevo dimenticato di calcellare un pezzetto :P
printf("%s ",pkt); -> LO VISUALIZZA PERFETTO
Al pkt aggiungo anche un'intero oltre che alla stringa gia presente
memcpy(pkt+sizeof(stringa),&(codice),sizeof(codice));
Adesso provo a mettere l'intero che ho copiato su un'altra variabile per vedere se riesco a riprendere il valore
memcpy(&index,pkt+sizeof(stringa),sizeof(index));
Verifico.....
printf(" ->%d\n",index); -> NULLA PURTROPPO.

trallallero
12-11-2007, 15:27
Sembra giusto quindi metti tutto il codice altrimenti non si riesce a capire bene

che tipo di dato è pkt ?

agus83
12-11-2007, 15:41
Hai ragione,avrei dovuto farlo prima...sorry
ecco il file mini di prova che ho fatto

main()
{
unsigned char stringa[] = "stringa di prova";
unsigned char pkt[64];
unsigned char *confronto = NULL;
int index;
int i;
int codice;

codice=547;

memcpy(pkt,stringa,sizeof(stringa));
printf("%s \n",pkt);
memcpy(pkt+sizeof(stringa),&(codice),sizeof(codice));
printf("%s \n",pkt);
memcpy(pkt+sizeof(codice),stringa,sizeof(stringa));
memcpy(&index,pkt+sizeof(stringa),sizeof(index));
printf(" -> %d \n",index);

return 0;
}

Purtoppo 'index' alla fine non contiene il valore di 'codice'

trallallero
12-11-2007, 15:46
c'è una linea di troppo, adesso funzica ;)

main()
{
unsigned char stringa[] = "stringa di prova";
unsigned char pkt[64];
unsigned char *confronto = NULL;
int index;
int i;
int codice;

codice=547;

memcpy(pkt,stringa,sizeof(stringa));
printf("%s \n",pkt);
memcpy(pkt+sizeof(stringa),&(codice),sizeof(codice));
printf("%s \n",pkt);
//memcpy(pkt+sizeof(codice),stringa,sizeof(stringa));
memcpy(&index,pkt+sizeof(stringa),sizeof(index));
printf(" -> %d \n",index);

return 0;
}

agus83
12-11-2007, 15:53
Grande,è vero!!!!!!!!!!!!!!!!!!!!!!!!!!!
Ma perchè se aggiungo altra roba al pacchetto non riesco a estrapolare lo stesso il valore con la memcpy e la dimensione del valore??? mmmhhh...in teoria non dovrebbe cambiare....nn so'...:confused:

agus83
12-11-2007, 16:04
risolto,sono uno scemo avevo sbagliato l'offset :P
Grazie Mille per l'aiuto!!!!!!!

trallallero
12-11-2007, 16:07
risolto,sono uno scemo avevo sbagliato l'offset :P
Grazie Mille per l'aiuto!!!!!!!

vedo che hai capito da solo.

Prego.

Se posso consigliarti: soprattutto in C (ma vale sempre) devi avere sotto controllo qualsiasi istruzione ;)