我有一个NSData项目,它持有一堆int。我该如何将它们送入NSArray?
NSData中的内存结构是小端序的32位int,一个接着一个。
对不起基本问题,但仍然在学习obj-c做事方式:)
答案 0 :(得分:13)
您可以使用OSByteOrder.h
中定义的函数来处理字节序。除了那个怪癖,这实际上只是抓住字节缓冲区并迭代它。
// 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;
}
答案 1 :(得分: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]);
答案 2 :(得分:1)
这个答案与上面的其他答案非常相似,但我发现将NSData字节转换回int32_t []数组是有益的。这段代码在小端处理器(在我的情况下是x64)上正常工作,但在big-endian(PPC)上会出现静默错误,因为字节表示将是big-endian。
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];
答案 3 :(得分:0)
以下一种可能的解决方案。 要考虑字节序,请在XCode文档集中查找Core Endian Reference(您可能会使用 EndianS32_LtoN (32位litte endian到本机字节序))。
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);