[Résolu] SWAP des octets

ancrouancrou Membre
avril 2008 modifié dans API AppKit #1
Bonjour,

Je lis dans un fichier 3F8A est je veux swapping en 8A3F. Voilà  mon code :
UI16_ crc;	//Check sum<br />	int index = 0;<br />	[mData getBytes:&amp;crc range:NSMakeRange(index, sizeof(crc))];<br />	index += sizeof(crc);<br />	printf(&quot;crc avant SWAP %X &#092;n&quot;,crc);<br />	crc=NSSwapBigIntToHost(crc);<br />	printf(&quot;crc après SWAP %X &#092;n&quot;,crc);


J'obtiens :
crc avant SWAP 3F8A
crc après SWAP 3F8A


Où est le problème ?

Merci

Réponses

  • schlumschlum Membre
    avril 2008 modifié #2
    C'est pas du swap, c'est de la conversion endianness. En machine PPC y aura un swap, en machine Intel, non.
    (ou l'inverse, mais j'ai pas le courage de réfléchir pour savoir dans quel sens ça joue là  :P)
  • ancrouancrou Membre
    17:07 modifié #3
    dans 1207836738:

    C'est pas du swap, c'est de la conversion endianness. En machine PPC y aura un swap, en machine Intel, non.
    (ou l'inverse, mais j'ai pas le courage de réfléchir pour savoir dans quel sens ça joue là  :P)


    Habituellement le PPC ne permute pas et Intel, oui.

    Mais mon fichier est comme ça Intel ou pas !
  • schlumschlum Membre
    avril 2008 modifié #4
    Converts the big-endian value in x to the endian format of the current platform and returns the resulting value. If it is necessary to swap the bytes of x, this function calls NSSwapInt to perform the swap.


    Donc si tu fais tourner ça sur du big-endian (donc les PPC utilisés sur les " anciens " Mac - l'inverse de ce que j'ai dit plus haut), ça ne fera rien...
  • ancrouancrou Membre
    17:07 modifié #5
    Mon fichier a les octets forts avant les octets faibles.
    Pour le moment, je dois faire du calcul sur ces valeurs (Check sum, pointer ...).
    Pensez vous que je dois les manipuler tel quel, sans les permuter ( faire du big-endiann)?
  • schlumschlum Membre
    17:07 modifié #6
    dans 1207838330:

    Mon fichier a les octets forts avant les octets faibles.
    Pour le moment, je dois faire du calcul sur ces valeurs (Check sum, pointer ...).
    Pensez vous que je dois les manipuler tel quel, sans les permuter ( faire du big-endiann)?


    Sur Mac-PPC, oui ; sur Mac-Intel, il faut permuter...
    D'où l'utilité de la fonction NSSwapBigIntToHost, sinon autant appeler directement NSSwapInt  ;)
  • ancrouancrou Membre
    17:07 modifié #7
    donc je fais un
    size=NSSwapLittleLongToHost(size);

    Car mon fichier est en BIg et je passe en Little

    Merci de votre aide
  • schlumschlum Membre
    17:07 modifié #8
    dans 1207840106:

    donc je fais un
    size=NSSwapLittleLongToHost(size);

    Car mon fichier est en BIg et je passe en Little

    Merci de votre aide


    Ah ben non, si le fichier est en big-endian, il ne faut pas utiliser SwapLittleLongToHost, mais SwapBigLongToHost.
  • ancrouancrou Membre
    17:07 modifié #9
    dans 1207840636:

    Ah ben non, si le fichier est en big-endian, il ne faut pas utiliser SwapLittleLongToHost, mais SwapBigLongToHost.

    Oui; je m'embrouille avec Little et Big...
    Comme mon fichier à  les octets faible sont en 1er (à  gauche). c'est du little-endian
    J'ai un PowerPC qui réfléchit en Big-endian (comme moi).

  • schlumschlum Membre
    17:07 modifié #10
    dans 1207841973:

    dans 1207840636:

    Ah ben non, si le fichier est en big-endian, il ne faut pas utiliser SwapLittleLongToHost, mais SwapBigLongToHost.

    Oui; je m'embrouille avec Little et Big...
    Comme mon fichier à  les octets faible sont en 1er (à  gauche). c'est du little-endian
    J'ai un PowerPC qui réfléchit en Big-endian (comme moi).




    Ah ben depuis tout à  l'heure tu dis que ton fichier est en Big  :P
    Donc s'il est en Little, c'est bien ça... NSSwapLittleLongToHost, et sur PPC ça va faire le swap.
    Comme tu avais mis NSSwapBigIntToHost, normal qu'il n'ait rien fait dans le code du premier post...
Connectez-vous ou Inscrivez-vous pour répondre.