我有一个持有一堆整数的NSData项目。我该如何着手将它们放到NSArray中?Obj-C如何将NSData转换为一个int数组?
NSData中的内存结构是小端顺序的32位int,一个接一个。
很抱歉的基本问题,但仍然在学习做事:)
我有一个持有一堆整数的NSData项目。我该如何着手将它们放到NSArray中?Obj-C如何将NSData转换为一个int数组?
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 bit litte endian to native endianness))。
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);
听起来有更清洁的方式做你想做什么,但这应该工作:
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];
你的意思是int32_t?这段代码是不是破解在x64上? – 2011-02-01 07:46:24
我认为`int`在x86_64上仍然是4个字节。这是'长',匹配字的大小。或者更具体地说,`int`依赖于编译器,但是在Cocoa支持的所有架构的gcc和clang中,它将是4个字节。不过,`int32_t`会更合适(你可以看到我的答案中使用了什么)。 – 2011-02-01 07:49:16