2009-12-10 2 views
9

Мне нужно поменять смысл некоторых значений и просто интересно, есть ли что-либо в Objective-C, в настоящее время я обмениваю байты с помощью функции CStyle ниже (что, очевидно, я могу повторно использовать), я просто хотел проверить, что ничего не было конкретный я пропал?Подстановка Endianness в 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

Благодаря указателям здесь я целыми отсортирован, Что самый простой способ поменять поплавок?

int myInteger = CFSwapInt32BigToHost(myInteger); 

(код выше обновлен)

float myFloat = floatFlip(myFloat); 

Гэри

+0

floatFlip() отлично выглядит. Я бы (лично) написал имя функции и аргументы, чтобы быть фиксированной шириной по доске 'Float32 Float32Flip (Float32 inFloat) {union {SInt32 intValue; Float32 newFloat; } inData, outData; ...} ', но я странный. Если вы используете C++, я бы передал по ссылке (для компилятора для проверки работоспособности - проверьте количество байтов для вас) или (C/objc) передайте указатель, поскольку вы в первую очередь заинтересованы в байтовой замене аргумента, а не байтовый обмен потенциально преобразованного/усеченного/переопределенного значения. – justin

ответ

5

Вы ищете OSSwapInt32() (или OSSwapInt16(), OSSwapInt64() и т.д.). См. OSByteOrder.h.

Также обратите внимание, что они не переносятся. Если вы только конвертируете в big-endian, вы можете захотеть использовать что-то вроде htonl(), которое включено в стандартную библиотеку <arpa/inet.h>. (К сожалению, нет стандартной библиотеки для простой замены back-and-forth.)