Klus page: http://klusthuis.blogspot.com
Bij endianess gaat het puur om de volgorde van twee bytes in een word. Het effect op een float is lastig uit te leggen aangezien deze anders opgeslagen wordt, maar voor een array geld gewoon dat de adressering niets veranderd. Het is verder ook erg afhankelijk van de gebruikte taal/compiler. Een array (of string, maar een string is gewoon een array van chars) is namelijk niet een dataformaat dat rechtstreeks door de processor begrepen wordt.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Of 4 in een dword, of 8 in een qword, of 10 in een tbyte. Op de gangbare platforms iig, maar het hangt idd altijd van het platform afJanoz schreef op dinsdag 02 oktober 2007 @ 16:35:
Bij endianess gaat het puur om de volgorde van twee bytes in een word.
Op de big-endian machines waar wij mee werken (PowerPC architecturen voornamelijk) zijn 4-byte floats en 8-byte doubles ook gewoon geswapped, net als met de ints. Geen idee of de PPC ook de 80-bits double ondersteunt overigens, maar dat is dan waarschijnlijk ook gewoon geswapped.Het effect op een float is lastig uit te leggen aangezien deze anders opgeslagen wordt
Wel moet je opletten met bit-fields in C en C++. Het is namelijk in de standaard niet vastgelegd in welke volgorde de bitfields in de elementen staan. Aangezien wij nogal wat packed data gebruiken dat compileerbaar moet zijn voor beide platforms, betekent dat dat we elke struct (over het algemeen gegenereerd uit een data template) in twee volgordes opschrijven, in een #if/#else/#endif preprocessor blok. Best irritant.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Wat we op dit moment doen is typen gebruiken en deze mbv typedef gelijk trekken tegen de juiste typen van het betreffende platform.
bij het verzenden word alles in bytes verzonden...
zo heb ik met
een float in chars gezet om te verzenden en aand e andere kane moet het weer naar een float worden gebouwt.
Nou staat er in mijn char-array:
chars[0]: 0x00
chars[1]: 0x00
chars[2]: 0x80
chars[3]: 0x3f
Maar om dit te valideren moet ik eigelijk weten hoe een float intern is gecodeerd (in elk geval op een windows x86 machine), who knows?
bij het verzenden word alles in bytes verzonden...
zo heb ik met
code:
1
2
3
| float F = 1; char chars[4]; memcpy(chars,(void*)&F,4); |
een float in chars gezet om te verzenden en aand e andere kane moet het weer naar een float worden gebouwt.
Nou staat er in mijn char-array:
chars[0]: 0x00
chars[1]: 0x00
chars[2]: 0x80
chars[3]: 0x3f
Maar om dit te valideren moet ik eigelijk weten hoe een float intern is gecodeerd (in elk geval op een windows x86 machine), who knows?
Klus page: http://klusthuis.blogspot.com
De x86 gebruikt IEEE754 floating point-getallen. Een float komt met het 32-bit type overeen en double met het 64-bit type.liquid_ice schreef op woensdag 03 oktober 2007 @ 09:14:
Maar om dit te valideren moet ik eigelijk weten hoe een float intern is gecodeerd (in elk geval op een windows x86 machine), who knows?
Developer Accused Of Unreadable Code Refuses To Comment
Over het algemeen komt de float 1.f op elk 32 bits platform wel overeen met de int 0x3f800000
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Pagina: 1