Toon posts:

[C] String to Integer

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe krijg ik deze string:

char Str[4]={0x00,0x40,0x12,0x60};

geconverteerd naar een integer value.

Str bevat het adres van een functie.
Nu doe ik het zo:

int Add;
Add=(int)(Str[0]*16777216+Str[1]*65536+Str[2]*256+Str[3]);
pfunc=(void(*D(...)Add;

Dit gaat alleen niet met alle adressen goed. Soms is het adres goed, maar soms is het te derde byte te groot of te klein.

Weet iemand hoe je dit wel goed kunt doen?

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Hoe bedoel je te groot of te klein?

  • mvdejong
  • Registratie: Juni 2000
  • Laatst online: 29-11-2024

mvdejong

When does the hurting stop ?

Als de byte-volgorde goed is (MSB versus LSB), dan is het simpel.
Een string is namelijk al een pointer naar een reeks van bytes, dus je hoeft hem alleen maar te casten naar dat "pointer to function" type dat je uiteindelijk voor de add gebruikt.

The number of things that Arthur couldn't believe he was seeing was fairly large


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 24-07 15:57
Is het niet makkelijker om gewoon die int in hexadecimaal te definieren?
Dus:
int i = 0x00401260;

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


  • Marcj
  • Registratie: November 2000
  • Laatst online: 09-09 11:42
int Add = ( ((int)(Str[0]))*16777216 + ((int)(Str[1]))*65536 +...
Dit zou toch moeten werken?

Verwijderd

Topicstarter
Even een voorbeeld. Ik gebruik deze code.

int Add;
Add=(int)(Str[0]*16777216+Str[1]*65536+Str[2]*256+Str[3]);
pfunc=(void((...)Add;

Deze string:
char Str[4]={0x00,0x40,0x12,0x60};
Gaat goed.

Deze string:
char Str[4]={0x00,0x40,0x12,0xa0};
Levert Add=0x004011a0

Het derde byte is dus verandert van 12 naar 11.

Dit begrijp ik dus niet.

Verwijderd

Misschien een domme opmerking, maarreh: De standaard fuction atoi? :D

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 21-06 17:02
verander
char Str[4]={0x00,0x40,0x12,0x60};
in
unsigned char Str[4]={0x00,0x40,0x12,0x60};

Verwijderd

Ten eerste: Als ik jouw was zou ik gewoon bitshift operators gebruiken ipv dat vermenigvuldigen, das denk ik iets duidelijker (en sneller), dus:
code:
1
int grootgetal = (Str[0] << 24) | (Str[1] << 16) | (Str[2] << 8) | Str[3];

Verder heeft Baron idd gelijk, je moet een unsigned char array hebben, de reden is dat bij signed getallen het eerste bitje aangeeft of het getal positief of negatief is, die 0xA0 die bij jouw bijv problemen gaf heeft als eerste bit een 1 waardoor de vermenigvuldiging niet helemaal gaat zoals jij zou willen. Als je aangeeft dat het unsigned getallen zijn gaat het dus wel goed.

Verwijderd

Topicstarter
Zulke dingen vergeet ik altijd.

Nu werkt het perfect. Bedankt!!
Pagina: 1