Obj-C如何将NSData转换为int数组?

时间:2011-02-01 06:50:55

标签: objective-c nsdata

我有一个NSData项目,它持有一堆int。我该如何将它们送入NSArray?

NSData中的内存结构是小端序的32位int,一个接着一个。

对不起基本问题,但仍然在学习obj-c做事方式:)

4 个答案:

答案 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);