24. maj 2002 - 10:08Der er
1 kommentar og 2 løsninger
Læsning af data fra void*
Hejsa
Jeg arbejder på et projekt hvor jeg får nogle netværksdata fra et lib ind i en funktion kaldet:
void incommingData(int size, void* dataBlock);
Jeg er relativ ny til c++ så jeg har ikke kunnet finde ud af hvordan jeg lige får hold i den data (fx ved at smække den i et char[] array). Jeg har ved at bruge fopen/fwrite fået skrevet dataen ud til en .bin fil, men det er som om jeg dårligt kan læse det =). Er der nogen her der kan komme på nogen eksempler til hvordan jeg kan læse (og egentligt også selv gemme data) på samme måde?
På forhånd tak
Skulle måske siges at netværkslibet kommunikerer over en byte "protocol" hvis det ikke fremgik af ovenstående. dataBlocken skulle ifølge documentationen indeholde den rå pakkedata skåret fri af headere.
Ad 1) Få fat i data Når du ved at dataBlock i virkeligheden er et byte array, kan du lave en alm. cast af den, dvs. behandle den somom det var en char* istedet. Hermed ville du så f-eks- vha. printf() familien kunne få den skrevet til skærmen eller lign. :
printf("Data : \'%.*s\'\n", size, dataBlock);
Ad 2) Læse/gemme data Du kan f.eks. bruge fopen(), fwrite()/fread() og fclose() sådan her:
int saveData(int size, void *dataBlock) { int ret = TRUE; FILE *outFile; if ((outFile = fopen("data.bin", "wb")) != NULL) { if (fwrite(dataBlock, size, 1, outFile) != 1) ret = FALSE; fclose(outFile); } else ret = FALSE; return ret; }
int getData(int *size, void *dataBlock, int maxSize) { int ret = TRUE; FILE *inpFile; *size = 0; if ((inpFile = fopen("data.bin", "rb")) != NULL) { if ((size = fread(dataBlock, 1, maxSize, 1, inpFile)) < 1) ret = FALSE; fclose(inpFile); } else ret = FALSE; return ret; }
BEMÆRK: i fread() er size, 1 vendt om til 1, maxSize i fht. fwrite, fordi fread() så returnerer antallet af rent faktisk læste bytes. Bemærk også at filen behandles "rb" og "wb", dvs. som binær fil i stf. tekst fil. (For tekstfiler bliver LF normal oversat til CR+LF og Ctrl+Z sætter eof, ligesom '\x0' (nul-bytes) ikke kan skrives/læses.
union MESSAGE_TYPE { struct Message_Type1 Msg1; struct Message_Type2 Msg2; // tilføj nye messages typer }
Det du kunne gøre, er at kopiere din datablok over i en variable af typen MESSAGE_TYPE. Herefter kan du tilgå dataerne forskelligt, afhængig af, hvordan du vil se på pakken.
f.eks.
TMESSAGE_TYPE GenericMsg;
GenericMsg.Msg1.TimeSlot // tilgå data som værende af type Message_Type1
eller
GenericMsg.Msg2.maxValue // tilgå data som værende af type Message_Type2
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.