2009-12-10 5 views
9

J'ai besoin d'échanger l'endianness de certaines valeurs et je me demandais s'il y avait quelque chose disponible en Objective-C, actuellement je permute les octets avec la fonction CStyle ci-dessous (que je peux évidemment réutiliser) je voulais juste vérifier spécifique je manquais?Échange d'Endianness en Objective-C?

float floatFlip(float inFloat) { 
    union { 
     int intValue; 
     float newFloat; 
    } inData, outData; 

    inData.newFloat = inFloat; 
    outData.intValue = CFSwapInt32BigToHost(inData.intValue); 
    return(outData.newFloat); 
} 

EDIT_001

Merci aux pointeurs ici j'ai trié des entiers, ce qui est la façon la plus simple d'échanger un flotteur?

int myInteger = CFSwapInt32BigToHost(myInteger); 

(code ci-dessus mis à jour)

float myFloat = floatFlip(myFloat); 

gary

+0

floatFlip() semble très bien. J'écrirais (personnellement) le nom de la fonction et les arguments à corriger sur toute la largeur du tableau 'Float32 Float32Flip (Float32 inFloat) {union {SInt32 intValue; Float32 nouveauFloat; } inData, outData; ...} ', mais je suis bizarre. Si vous utilisez C++, je passerais par référence (pour que le compilateur vérifie le nombre d'octets pour vous), ou (C/objc) passerait un pointeur puisque vous êtes principalement intéressé par un échange d'octets de l'argument, plutôt que un échange d'octets d'une valeur potentiellement convertie/tronquée/réinterprétée. – justin

Répondre

10

En plus des API déjà mentionnées, il y a CoreFoundation/CFByteOrder.h.

2

Avez-vous trouvé

Endian.h  
OSByteOrder.h 
5

Vous cherchez OSSwapInt32() (ou OSSwapInt16(), OSSwapInt64(), etc.). Voir OSByteOrder.h.

Notez également que ceux-ci ne sont pas portables. Si vous convertissez uniquement en big-endian, vous pouvez envisager d'utiliser quelque chose comme htonl(), qui est inclus dans la bibliothèque standard <arpa/inet.h>. (Malheureusement, cependant, il n'y a pas de bibliothèque standard pour le simple échange de va-et-vient.)