2011-02-01 11 views

cevap

13

. Bu tuhaflıktan başka, bu sadece bayt tamponunu yakalayıp üzerinde yineleme sorunu.

// 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

için değiştiren koddur. Bu kodu projemde kullanıyorum ve iyi çalışıyor. – Justin808

0

olası bir çözüm yapmanın obj-c yolunu öğrenme. Endensiteyi hesaba katmak için, XCode doc setinde Core Endian Reference'ı arayın (büyük olasılıkla EndianS32_LtoN (yerel endianiteye 32 bit litte endian)). Yapmaya çalıştığınız şeyi yapmak temizleyici yolu vardır gibi

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

Yani int32_t? Bu kod x64'de bozuk değil mi? –

+1

Sanırım "int" hala x86_64 üzerinde 4 bayt uzunluğunda. Kelime boyutuyla eşleşen 'uzun'. Ya da daha spesifik olarak, 'int' derleyiciye bağımlıdır, ancak kakao destekli tüm mimarlarda gcc ve clang olarak 4 bayt olacaktır. Yine de, “int32_t” daha uygun olurdu (ve cevabımda ne kullandığımı görebilirsiniz). –

+0

Kodu x86_64'de yazdım - int hala 4 bayt uzunluğunda. Ama ikiniz de haklısınız, int32_t daha uygun. – diciu

2

geliyor, ama bu çalışması gerekir: Sen endian başa tanımlanan işlevleri kullanabilirsiniz

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

Bu cevap yukarıdaki diğer cevaplar çok benzer, ama öğretici NSData geri bir int32_t [] dizisine bayt döküm ile oynamak bulundu. Bu kod, küçük bir ender işlemciye (benim durumumdaki x64) doğru çalışır, ancak büyük endian (PPC) üzerinde sessizce yanlış olur çünkü bayt gösterimi büyük-endian olur.

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]; 
İlgili konular