Avatar billede webster Nybegynder
24. maj 2002 - 10:08 Der 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.
Avatar billede chries Nybegynder
24. maj 2002 - 10:16 #1
void incommingData(int size, void* dataBlock)
{
    unsigned char *pData = static_cast<unsigned char*>(dataBlock);

    pData[0] = ..start..
    pData[size-1] = ..slut..

}
Avatar billede soepro Nybegynder
24. maj 2002 - 10:57 #2
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.
Avatar billede laffe Nybegynder
24. maj 2002 - 14:37 #3
Du kunne også vælge at bruge en union til at fortolke din datablok.

Nedenstående viser to typer pakker, som begge er defineret i en union (MESSAGE_TYPE).

struct Message_Type1
{
  unsigned char State;
  unsigned char Stream;
  unsigned char TimeSlot;
  unsigned char Reason;
};

struct Message_Type2
{
int maxValue
};

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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester