2009-12-10 19 views
9

Muszę zamienić endianizm niektórych wartości i zastanawiałem się, czy było coś dostępnego w Objective-C, obecnie zamieniam bajty z funkcją CStyle poniżej (co oczywiście mogę ponownie wykorzystać) Po prostu chciałem sprawdzić, czy nie było nic konkretna, której mi brakowało?Zamiana endianness w 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

Dzięki tutejszych wskazówek mam całkowitymi sortowane, co jest najprostszym sposobem, aby zamienić pływaka?

int myInteger = CFSwapInt32BigToHost(myInteger); 

(kod powyżej aktualizowany)

float myFloat = floatFlip(myFloat); 

gary

+0

floatFlip() wygląda dobrze. Chciałbym (osobiście) napisać nazwę funkcji i argumenty, które mają być ustalone na całej szerokości 'Float32 Float32Flip (Float32 inFloat) {union {SInt32 intValue; Float32 newFloat; } inData, outData; ...} ', ale jestem dziwny. Jeśli używasz C++, przechodzę przez referencję (dla kompilatora do sprawdzenia poprawności liczby bajtów dla ciebie), lub (C/objc) przekazuję wskaźnik, ponieważ jesteś przede wszystkim zainteresowany zamianą bajtów argumentu, zamiast zamiana bajtów potencjalnie skonwertowanej/skróconej/reinterpretowanej wartości. – justin

Odpowiedz

2

Znalazłeś

Endian.h  
OSByteOrder.h 
5

Szukacie OSSwapInt32() (lub OSSwapInt16(), OSSwapInt64(), itd.). Zobacz OSByteOrder.h.

Należy również pamiętać, że są one nieprzenośne. Jeśli konwertujesz tylko do dużych endianów, możesz rozważyć użycie czegoś takiego jak htonl(), które jest zawarte w standardowej bibliotece <arpa/inet.h>. (Niestety, nie ma standardowej biblioteki do zwykłej zamiany wstecz).