[C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Nahodou netusi nekdo jesi v C existuje modifikator delky promennych v argumentu sscanf tak, aby slo nacitat primo do promenny typu byte (unsigned char)?
Kdyz mam treba:
unsigned char ip[4];
sscanf(buffer,"blabla %u.%u.%u.%u blabla",ip+0,ip+1,ip+2,ip+3);
tak to rve, ze formatovaci retezec %u ocekava pointer typu int, zatimco argument je pointer typu byte. Maximalne sem nasel %hu, ktery to zkrati na typ unsigned short, ale to je porad moc. Takze pak promennou ip musim vytvorit zbytecne jako unsigned int ip[4] nebo unsigned short int ip[4];
Este me napada v argumentu sscanf ty pointery pretypovat na (unsigned int *), jenze to je prasarna, pac to bude zas prepisovat i pamet za poslednim prvkem ip[3] v celkovy velikosti 2 nebo 4 byte, kery bych tam musel rezervovat
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Nevim jestli tomu dobre rozumim, ale co ti brani pouzit jednoduche "%c" ?
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Citace:
Původně odeslal
Caleb
Nevim jestli tomu dobre rozumim, ale co ti brani pouzit jednoduche "%c" ?
%c mi precte jeden znak z retezce ale ja chci precist cely dekadicky cislo, kery se muze sestavat z 1 az 3 znaku v rozsahu 0-255
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Jo uz to chapu :)
Osobne bych to
a) neresil, pripadne bych si pak v nejaky cyklu ty promenne z pole intu prekopiroval do pole charu
b) naprogramoval si vlastni funkci, ktera by mi z onoho retezce ty cisla vykopirovala
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
No prave me stve resit preformatovani pres int, kdyz to chci naladovat primo do naky pevne dany struktury, kde sou bajtovy polozky. Funkci si napsat muzu, ale to leda ze bych to pouzival vickrat. Takze patram jesi sem jen neco na tom mocnem sscanfu neprehlid nebo to fakt neumi.
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Podla man sscanf je to hh.
Kód:
sscanf(buffer,"blabla %hhu.%hhu.%hhu.%hhu blabla",ip+0,ip+1,ip+2,ip+3);
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Citace:
Původně odeslal
Rainbow
Podla man sscanf je to hh.
Kód:
sscanf(buffer,"blabla %hhu.%hhu.%hhu.%hhu blabla",ip+0,ip+1,ip+2,ip+3);
Jo diky, ze me to nenapadlo! Kdyz se pouziva %l a %ll tak proc ne %hh
Este sem si vocekoval, jesi to fakt nepretejka a je to OK
Kód:
unsigned char ip[5];
ip[4]=0x5A;
sscanf(buffer,"%s %ld %u %c %hhu.%hhu.%hhu.%hhu:%u %lX %lu",fn,&fsize,&fid,&mode,ip+0,ip+1,ip+2,ip+3,&port,&chksum,&exectime);
printf("overflow check: %02X\n",ip[4]);
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Jo ale peknyho majza na to %hhu! Ne kazdej prekladac to ma totiz spravne implementovany. Na PC s gcc 4.1.2 mi to fungovalo spravne ale na ARMu - arm-gcc 3.4.6 to ty polozky nacitalo jako UINT16! Kram jeden prasivej....
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
na gcc pre xc167 som pouzival %hu, ak ti to pomoze
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Neviem odkedy tam to hh je - ale myslim, ze v m$ visual studio to neslo. Tak je mozne, ze to nepojde este aj vselikde inde.
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Citace:
Původně odeslal
Rainbow
Neviem odkedy tam to hh je - ale myslim, ze v m$ visual studio to neslo. Tak je mozne, ze to nepojde este aj vselikde inde.
No zajimavy je, ze mingw32 s gcc 3.4.5 to zvlada zimco arm-gcc 3.4.6 ne. Bohuzel o tom vic nevim, jaky patche tam kdo dal a tak... Tak sem to dal raci sproste do pole 32bit intu kde nehrozi ze by to preteklo.
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Citace:
Původně odeslal
Rainbow
A co pouzita libc?
Dobra poznamka :) Da se nejak zistit verze? z .h nebo .a ?
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Re: [C] - sscanf(): formatovaci retezec pro nacitani 8bit polozek
Tak asi nijak rozumne to nejde. Akorat v linuxu kde je dynamicky linkovani de zistit prikazem ldd jaky knihovny to pouziva a tam v nazvu verze je. No nic, nebudu to dal pitvat. Ale pouzivani tohodle formatovaciho retezce proste neni moc bezpecny pri prenosu mezi platformama.