好,您可以直接訪問數據對象中的原始字節。
void const *dataPtr = [data bytes];
現在你有一個指向原始內存,您可以在想要的任何方式複製(這些規則適用於任何數據傳輸,而不僅僅是iOS版)。如果您需要考慮對齊邊界,則需要使用memcpy。
int32_t myInt;
memcpy(&myInt, dataPtr);
否則,如果在一個體繫結構,允許跨邊界對齊整數操作...
int32_t myInt = *(int32_t const *)dataPtr;
現在,ARM支持跨邊界對齊訪問,但它是慢得多。我沒有做過性能比較,但是你不會繼續使用錯誤指針,因此它可能比memcpy函數調用更好(儘管如此,說實話,這可能是你考慮太多性能的原因)。
最大的問題是數據的字節順序。如果它是由你提供的,那麼做你想做的,但你應該更喜歡一個標準。
如果它來自第三方,可能是網絡字節順序(又名big-endian)。您可能需要轉換爲主機端代表。幸運的是,這是直接與hton
和ntoh
和他們的朋友。英特爾是小端,網絡字節順序是大端,現代的Mac和iOS設備是小端的,老的Mac是大端的。
// Convert from network order to host order.
// Does the right thing wherever your code is running
myInt = ntohl(myInt);
總之,要麼...
int32_t myInt = ntohl(*(int32_t const *)[data bytes]);
或
int32_t myInt;
memcpy(&myInt, [data bytes);
myInt = ntohl(myInt);
因此,該數據已經在那裏得到的莫名其妙。這是,逆...
int32_t myInt = 42;
myInt = htonl(myInt);
NSData *data = [NSData dataWithBytesNoCopy:&myInt length:sizeof(myInt) freeWhenDone:NO];
當然,使用正確的數據初始化......一個只會使用堆棧上的原始字節,所以你最好不要堆解開後使用。
除非您保證接收器數據將與某個邊界對齊,否則您不必擔心要發送的數據對齊。
'NSData'不響應'objectForKey:'你是否要聲明一個'NSDictionary'參數? – 2012-08-08 23:04:23
opps是NSDictionary是我的意思,它包含NSData的條目..這就是我困惑的地方,我會修復我的問題,使其高度可讀性 – HurkNburkS 2012-08-08 23:07:27
感謝幫助傢伙我非常抱歉意外的問題不是NSData。這一切的一線是,我已經學習了將NSData傳遞給int32_t對象的技巧:)所以現在我要去了解如何將NSString轉換爲int32_t – HurkNburkS 2012-08-09 02:52:28