2011-02-01 1 views

답변

13

. 그 버크를 제외하고, 이것은 실제로 바이트 버퍼를 잡고 그것을 반복하는 것입니다.

// returns an NSArray containing NSNumbers from an NSData 
// the NSData contains a series of 32-bit little-endian ints 
NSArray *arrayFromData(NSData *data) { 
    void *bytes = [data bytes]; 
    NSMutableArray *ary = [NSMutableArray array]; 
    for (NSUInteger i = 0; i < [data length]; i += sizeof(int32_t)) { 
     int32_t elem = OSReadLittleInt32(bytes, i); 
     [ary addObject:[NSNumber numberWithInt:elem]]; 
    } 
    return ary; 
} 
+0

저는이 코드를 프로젝트에서 사용했으며 잘 작동합니다. – Justin808

0

한 가지 가능한 솔루션을하기의 OBJ-C 방법을 학습. 엔디안을 고려하려면 Xcode 문서 세트에서 Core Endian Reference를 찾아보십시오. EndianS32_LtoN (기본 엔디안과 32 비트 리디지 엔디 언)을 사용합니다. 당신이하려고하는 일을 할 수있는 청소기 방법이있는 것처럼

int mem[]= {0x01, 0x02, 0x03, 0x04, 0xff}; 


NSData * data = [NSData dataWithBytes:mem length:sizeof(mem)*sizeof(int)]; 
NSMutableArray * ar = [NSMutableArray arrayWithCapacity:10]; 

/* read ints out of the data and add them to the array, one at a time */ 
int idx=0; 
for(;idx<[data length]/sizeof(int);idx+=sizeof(int)) 
     [ar addObject:[NSNumber numberWithInt:*(int *)([data bytes] + idx)]]; 

NSLog(@"Array:%@", ar); 
+0

int32_t를 의미합니까? x64에서이 코드가 손상되지 않았습니까? –

+1

'int'는 x86_64에서 여전히 4 바이트 길이라고 생각합니다. 단어 크기와 일치하는 '길다'입니다. 또는 더 구체적으로,'int'는 컴파일러에 의존하지만, 코코아가 지원하는 모든 아키텍쳐에서 gcc와 clang을 지원하면 4 바이트가됩니다. 그럼에도 불구하고'int32_t'가 더 적절할 것입니다 (그리고 여러분은 제가 답안에서 무엇을 사용했는지 알 수 있습니다). –

+0

x86_64에 코드를 작성했습니다. int는 여전히 4 바이트입니다. 하지만 두 가지 모두 맞습니다. int32_t가 더 적절합니다. – diciu

2

는 소리 만이 작동합니다 : 당신은 엔디안 처리하는 에 정의 된 기능을 사용할 수 있습니다

NSData *data = ...; // Initialized earlier 
int *values = [data bytes], cnt = [data length]/sizeof(int); 
for (int i = 0; i < cnt; ++i) 
    NSLog(@"%d\n", values[i]); 
1

이 답변은 위의 다른 답변과 매우 유사하지만 NSData 바이트를 int32_t [] 배열로 다시 캐스팅 할 때 유용합니다. 이 코드는 리틀 엔디안 프로세서 (필자의 경우 x64)에서 제대로 작동하지만 바이트 표현이 빅 엔디안이기 때문에 빅 엔디안 (PPC)에서 잘못 인식됩니다.

int32_t raw_data[] = {0,1,2,3,4,5,6,7,8,9,10}; 
printf("raw_data has %d elements\n", sizeof(raw_data)/sizeof(*raw_data)); 
NSData *data = [NSData dataWithBytes:(void*)raw_data length:sizeof(raw_data)]; 
printf("data has %d bytes\n", [data length]); 
int32_t *int_data_out = (int32_t*) [data bytes]; 
for (int i=0; i<[data length]/4; ++i) 
    printf("int %d = %d\n", i, int_data_out[i]); 
[data release];