2011-02-01 35 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

一个可能的解决方案如下的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); 
+0

你的意思是int32_t?这段代码是不是破解在x64上? – 2011-02-01 07:46:24

+1

我认为`int`在x86_64上仍然是4个字节。这是'长',匹配字的大小。或者更具体地说,`int`依赖于编译器,但是在Cocoa支持的所有架构的gcc和clang中,它将是4个字节。不过,`int32_t`会更合适(你可以看到我的答案中使用了什么)。 – 2011-02-01 07:49:16

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];