Objective c Obj-C如何将NSData转换为整数数组?

Objective c Obj-C如何将NSData转换为整数数组?,objective-c,nsdata,Objective C,Nsdata,我有一个NSData项,它包含一堆整数。我该怎么把他们弄出来,弄到一个垃圾堆里去呢 NSData中的内存结构是32位整数,以小端顺序排列,一个接一个 很抱歉问了这个基本问题,但仍在学习obj-c的做事方式:)下面是一个可能的解决方案。 要考虑到endianness,请在XCode文档集中查找核心endians引用(您可能会使用EndianS32\u LtoN(32位小endians到本机endianness)) int mem[]={0x01、0x02、0x03、0x04、0xff}; NSDa

我有一个NSData项,它包含一堆整数。我该怎么把他们弄出来,弄到一个垃圾堆里去呢

NSData中的内存结构是32位整数,以小端顺序排列,一个接一个


很抱歉问了这个基本问题,但仍在学习obj-c的做事方式:)

下面是一个可能的解决方案。 要考虑到endianness,请在XCode文档集中查找核心endians引用(您可能会使用EndianS32\u LtoN(32位小endians到本机endianness))

int mem[]={0x01、0x02、0x03、0x04、0xff};
NSData*data=[NSData dataWithBytes:mem长度:sizeof(mem)*sizeof(int)];
NSMutableArray*ar=[NSMutableArray阵列容量:10];
/*从数据中读取整数并将其添加到数组中,每次一个*/
int-idx=0;

for(;idx听起来有更干净的方法来做你想做的事情,但这应该是可行的:

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*data=…;//较早初始化
int*values=[数据字节],cnt=[数据长度]/sizeof(int);
对于(int i=0;i
您可以使用OSByteOrder.h
中定义的函数来处理endianness。除了这个怪癖,这实际上只是抓取字节缓冲区并对其进行迭代的问题

// 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;
}
//从NSData返回包含NSNumbers的NSArray
//NSData包含一系列32位小尾端整数
NSArray*arrayFromData(NSData*data){
void*字节=[数据字节];
NSMUTABLEARRY*ary=[NSMUTABLEARRY];
对于(整数i=0;i<[数据长度];i+=sizeof(int32_t)){
int32_t elem=OSReadLittleInt32(字节,i);
[ary addObject:[NSNumber numberWithInt:elem]];
}
回归分析;
}

此答案与上面的其他答案非常相似,但我发现将NSData字节强制转换回int32_t[]数组很有启发性。此代码在小型endian处理器(在我的例子中为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];
int32_t原始数据[]={0,1,2,3,4,5,6,7,8,9,10};
printf(“原始数据有%d个元素”\n“,sizeof(原始数据)/sizeof(*原始数据));
NSData*data=[NSData data WITH BYTES:(void*)原始数据长度:sizeof(原始数据)];
printf(“数据有%d个字节,[data length]);
int32_t*int_data_out=(int32_t*)[数据字节];

对于(int i=0;我认为,
int
在x86_64上仍然是4字节长。匹配字长的是
long
。或者更具体地说,
int
依赖于编译器,但在Cocoa支持的所有体系结构的gcc和clang中,它将是4字节。不过,
int32_t
更合适(你可以看到我在回答中使用了什么)。我在x86_64上编写了代码-int仍然是4字节长。但你们都是对的,int32_t更合适。NSInteger是为x86_64更改的。您的建议的第2行给出了一个警告:
使用“const void*”类型的表达式初始化“int*”将丢弃限定符。
。这是什么意思?
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];