"Andreas Andersen" <andreasa@daimi.au.dk> skrev:
>Jeg har i øvrigt fået det til at virke med Jesper Tofts løsning.
Den virker kun, fordi du er heldig. Og med daimi i adressen er det ikke
godt at forlade sig på held.
>hvis instr f.eks. er 02 DA CE 15
>og jeg skriver readBytes(2) får jeg 02DA tilbage og ikke 02DACE15
> unsigned int theResult=0;
> memcpy(&theResult, (instr + ip), number);
Hvis sizeof(unsigned int)==4 ender theResult med dette bitmønster:
02 DA 00 00
På en little-endian CPU, som Intels x86, fortolkes det som 0xDA02 (og
ikke 0x02DA, som du skrev, men det er nu en detalje). Men en big-endian
processor vil fortolke det som 0xDA020000, så din metode vil returnere
et meget stort og forkert tal.
Big-endian CPU'er er fx Motorola 680x0, PowerPC og Sparc, så på en Mac
eller en Sun ville programmet opføre sig fejlagtigt. Network byte-order
(dvs den måde internet-protokoller overfører data på) er svjh ligeledes
big-endian.
Løsningen er 1) at klarlægge formatet af data og derefter 2) eksplicit
læse/skrive i det format. Fx ville en skudsikker måde (håber jeg; det er
off the top of my head og utestet og længe siden jeg sidst har C'et) at
læse 2 bytes little-endian data på, være:
theResult = (unsigned int)instp[0] + ((unsigned int)instp[1]<<8)
mvh Richard
--
Richard Flamsholt
richard@flamsholt.dk -
www.richard.flamsholt.dk