나는 한 무리의 int를 보유하고있는 NSData 항목을 가지고있다. NSArray로 가져 오는 방법은 무엇입니까?Obj-C NSData를 정수 배열로 변환하는 방법은 무엇입니까?
NSData의 메모리 구조는 리틀 엔디안 순서로 32 비트 int이고 다른 하나는 바로 뒤입니다.
기본적인 질문에 대한 죄송합니다,하지만 여전히 일 : 아래
나는 한 무리의 int를 보유하고있는 NSData 항목을 가지고있다. NSArray로 가져 오는 방법은 무엇입니까?Obj-C NSData를 정수 배열로 변환하는 방법은 무엇입니까?
NSData의 메모리 구조는 리틀 엔디안 순서로 32 비트 int이고 다른 하나는 바로 뒤입니다.
기본적인 질문에 대한 죄송합니다,하지만 여전히 일 : 아래
. 그 버크를 제외하고, 이것은 실제로 바이트 버퍼를 잡고 그것을 반복하는 것입니다.
// 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;
}
한 가지 가능한 솔루션을하기의 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);
int32_t를 의미합니까? x64에서이 코드가 손상되지 않았습니까? –
'int'는 x86_64에서 여전히 4 바이트 길이라고 생각합니다. 단어 크기와 일치하는 '길다'입니다. 또는 더 구체적으로,'int'는 컴파일러에 의존하지만, 코코아가 지원하는 모든 아키텍쳐에서 gcc와 clang을 지원하면 4 바이트가됩니다. 그럼에도 불구하고'int32_t'가 더 적절할 것입니다 (그리고 여러분은 제가 답안에서 무엇을 사용했는지 알 수 있습니다). –
x86_64에 코드를 작성했습니다. int는 여전히 4 바이트입니다. 하지만 두 가지 모두 맞습니다. int32_t가 더 적절합니다. – diciu
는 소리 만이 작동합니다 : 당신은 엔디안 처리하는 에 정의 된 기능을 사용할 수 있습니다
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]);
이 답변은 위의 다른 답변과 매우 유사하지만 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];
저는이 코드를 프로젝트에서 사용했으며 잘 작동합니다. – Justin808