2009-12-10 7 views
9

Necesito cambiar el endianness de algunos valores y me preguntaba si había algo disponible en Objective-C, actualmente estoy intercambiando los bytes con la función CStyle a continuación (que obviamente puedo reutilizar) Solo quería comprobar que no había nada específico que me faltaba?Intercambio de endianidad 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

Gracias a los punteros Aquí he ordenado enteros, cuál es la forma más sencilla para intercambiar un flotador?

int myInteger = CFSwapInt32BigToHost(myInteger); 

(Código anterior actualización)

float myFloat = floatFlip(myFloat); 

Gary

+0

floatFlip() se ve bien. Yo (personalmente) escribiría el nombre de la función y los argumentos para que sean de ancho fijo en el tablero 'Float32 Float32Flip (Float32 inFloat) {union {SInt32 intValue; Float32 newFloat; } inData, outData; ...} ', pero soy raro. Si está usando C++, pasaría por referencia (para que el compilador compruebe con cordura el recuento de bytes por usted), o (C/objc) pase un puntero ya que está interesado principalmente en un intercambio de bytes del argumento, en lugar de un intercambio de bytes de un valor potencialmente convertido/truncado/reinterpretado. – justin

Respuesta

10

Además de las API ya mencionadas, está CoreFoundation/CFByteOrder.h.

2

¿Ha encontrado

Endian.h  
OSByteOrder.h 
5

Usted está buscando OSSwapInt32() (o OSSwapInt16(), OSSwapInt64(), etc.). Ver OSByteOrder.h.

También tenga en cuenta que estos no son portátiles. Si solo está convirtiendo a big-endian, puede considerar usar algo como htonl(), que se incluye en la biblioteca estándar <arpa/inet.h>. (Desafortunadamente, sin embargo, no hay una biblioteca estándar para simplemente intercambiar de ida y vuelta.)

Cuestiones relacionadas