2010-06-23 3 views
3

У меня есть объект NSData с длиной в 4 байта. Я знаю, что это 4 байта создает положительное целое число. Как мне получить int из объекта NSdata?Int from NSData

+0

Является ли 4-байтовое значение 32-разрядным номером или 4 цифрами ASCII? Например. будет 4321 быть 0x000010E1 (32-разрядное big-endian число) или 0x34333231 («4321» в ASCII). Если это номер, он подписан (int32_t) или unsigned (uint32_t)? Является ли это большим эндиантом или маленьким концом (или же как работает система)? –

+0

Я нашел решение здесь. буфер символов [4]; \t \t \t [данные getBytes: длина буфера: 4]; \t \t \t \t \t int dataSize = 0; \t \t \t char cBuf2 [4]; \t \t \t для (INT = 0, K <4; к ++) \t \t \t { \t \t \t \t cBuf2 [к] = буфер [3-к]; \t \t \t} \t \t \t тетсру (& DataSize, cBuf2, 4); \t \t \t \t \t \t NSLog (@ "размер Индекс потока:% d", DataSize); –

ответ

1

Я нашел решение здесь.

char buffer[4]; 

[data getBytes:buffer length:4]; 

int dataSize = 0; 

char cBuf2[4]; 

for(int k=0;k < 4; ++k) { 

cBuf2[k] = buffer[3-k]; 

} 

memcpy(&dataSize, cBuf2, 4); 

NSLog(@"Zip stream size :%d", dataSize); 
12

Если вы знаете порядок байт соответствует текущей системе:

x = *(const UInt32 *)[theData bytes]; 

Если вы знаете, порядок байт в обратном направлении, следует, что с:

x = Endian32_Swap(x); 

Если вы не уверены в источнике и цели endianness, вы, вероятно, должны найти другой способ передачи данных.

+2

Вы можете использовать 'EndianU32_BtoN' (или' EndianS32_BtoN' для подписания), если вы знаете, что источник является big-endian, и 'EndianU32_LtoN', если вы знаете, что это малоподобный. Это означает, что вам не нужно знать конечность работающей системы. –

+0

- (Недействительными) onSocket: (AsyncSocket *) носка didReadData: (NSData *) данные withTag: (длинный) тег { // Я знаю, что эти данные длиной 4 байта NSString * msgReceived = [[[NSString Alloc] initWithData : кодирование данных: NSUTF8StringEncoding] autorelease]; // Я хочу получить int из NSData } –

3
int32_t value; // make unsigned if needed. 
[myData getBytes: &value]; 
+1

'getBytes:' устарел в OS X 10.6 и iPhone OS 4.0, поэтому можно использовать ['getBytes: length:'] (http: // разработчик .apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html # // apple_ref/occ/instm/NSData/getBytes: length :), чтобы избежать предупреждений. – dreamlax

+0

Спасибо за ответ. , но это возвращает огромное целочисленное значение, например 865465934. Я застрял в этом почти 1 день. –

+2

@charith, это звучит так, как будто это неверно, попробуйте поменять его на ['NSSwapLittleIntToHost'] (http://developer.apple.com/mac/library/documentation/cocoa/reference/foundation/Miscellaneous/Foundation_Functions/Reference/ reference.html # // apple_ref/c/func/NSSwapLittleIntToHost) – dreamlax