2009-12-10 39 views
9

Tôi cần phải trao đổi tính xác thực của một số giá trị và chỉ tự hỏi nếu có bất kỳ điều gì trong Objective-C, hiện tại tôi đang trao đổi các byte với hàm CStyle bên dưới (rõ ràng là tôi có thể sử dụng lại). cụ thể tôi đã mất tích?Hoán đổi Endianness trong mục tiêu-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

Nhờ các con trỏ ở đây tôi đã sắp xếp các số nguyên, whats cách đơn giản nhất để trao đổi một phao?

int myInteger = CFSwapInt32BigToHost(myInteger); 

(Mã trên được cập nhật)

float myFloat = floatFlip(myFloat); 

gary

+0

floatFlip() có vẻ ổn. Tôi sẽ (cá nhân) viết tên hàm và đối số được cố định chiều rộng trên bảng 'Float32 Float32Flip (Float32 inFloat) {union {SInt32 intValue; Float32 newFloat; } inData, outData; ...} ', nhưng tôi kỳ lạ. Nếu bạn đang sử dụng C++, tôi sẽ chuyển qua tham chiếu (cho trình biên dịch để kiểm tra độ tin cậy của byte), hoặc (C/objc) truyền con trỏ vì bạn chủ yếu quan tâm đến việc hoán đổi byte của đối số, thay vì một sự hoán đổi byte của một giá trị có khả năng được chuyển đổi/cắt ngắn/được diễn giải lại. – justin

Trả lời

10

Cũng như các API đã được đề cập, có CoreFoundation/CFByteOrder.h.

2

Bạn đã tìm thấy

Endian.h  
OSByteOrder.h 
5

Bạn đang tìm kiếm OSSwapInt32() (hoặc OSSwapInt16(), OSSwapInt64(), vv). Xem OSByteOrder.h.

Cũng lưu ý rằng những thứ này không mang tính di động. Nếu bạn chỉ chuyển đổi thành người lớn tuổi, bạn có thể muốn xem xét sử dụng một cái gì đó như htonl(), được bao gồm trong thư viện chuẩn <arpa/inet.h>. (Thật không may, mặc dù, không có thư viện chuẩn nào chỉ đơn giản là hoán đổi qua lại.)

Các vấn đề liên quan