2012-09-14 11 views

risposta

31

utilizzare un oggetto NSMutableData e il metodo -(void)appendData:(NSData *)otherData

cura di aggiungere esempio:

NSMutableData *concatenatedData = [NSMutableData data]; 
[concatenatedData appendData:iv]; 
[concatenatedData appendData:salt]; 
[concatenatedData appendData:encryptedData]; 
// and now you have all of the data in the single variable "concatenatedData" 
+0

Come recuperare i dati dal particolare NSMutableData. –

+0

@VineeshTP i dati concatenati SONO i dati mutabili. – quantumpotato

0

Si potrebbe utilizzare NSMutableData s' -appendData metodo:

NSMutableData *result = [NSMutableData data]; 

[result appendData:iv]; 
[result appendData:salt]; 
[result appendData:encryptedData]; 

// result now has what you need. 

questo ha l'overhead di utilizzare i dati mutevoli, che possono essere più lenta & utilizzare più memoria, in modo da utilizzare con cautela. In generale non vuoi che il grande NSData stia fluttuando.

-3

Innanzitutto creare due NSObjects e utilizzare questo metodo

-(void)appendData:(NSData *)otherData 

e messo in una NSData successivamente con Anche il 3 ° NSData concatena con lo stesso metodo.

+0

Grazie per il tuo aiuto. Ma sono nuovo per l'iphone e sono un po 'confuso ... Puoi darmi il codice per unirmi a questi tre NSData .. Grazie in anticipo, –

4

Per coloro che codificano per iOS5 e versioni successive. Mi piacerebbe mostrare una vera concatenazione. Perché quelle risposte non sono abbastanza buone? Perché riguardano l'utilizzo extra della memoria per i dati copiati. Vediamo la risposta:

NSMutableData *concatenatedData = [NSMutableData data]; 
[concatenatedData appendData:iv]; 
[concatenatedData appendData:salt]; 
[concatenatedData appendData:encryptedData]; 

qui abbiamo memoria allocata per iv, salt e encryptedData anche ogni volta che aggiungiamo uno di loro al nostro concatenazione mutevole siamo ovviamente copiarlo dati mutabili di nuovo. Vogliamo queste spese extra mentre gestiamo grandi quantità di dati? Io no.

C'è un modo per evitare questa spesa inutile della memoria - dispatch_data Non ho intenzione di spiegare come funziona, puoi google se vuoi. ho appena invia un codice che funziona:

NSData *iv = [@"some data" dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *salt = [@"even more data" dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *encryptedData = [@"and one more" dataUsingEncoding:NSUTF8StringEncoding]; 
dispatch_queue_t queue = dispatch_get_global_queue(0, 0); 
dispatch_data_t dispatch_data_iv = dispatch_data_create([iv bytes], [iv length], queue, DISPATCH_DATA_DESTRUCTOR_DEFAULT); 
dispatch_data_t dispatch_data_salt = dispatch_data_create([salt bytes], [salt length], queue, DISPATCH_DATA_DESTRUCTOR_DEFAULT); 
dispatch_data_t dispatch_data_encrypted = dispatch_data_create([encryptedData bytes], [encryptedData length], queue, DISPATCH_DATA_DESTRUCTOR_DEFAULT); 
iv = nil; salt = nil; encryptedData = nil; // free all parts, we dont need it anymore 
dispatch_data_t dispatch_data_concat = dispatch_data_create_concat(dispatch_data_create_concat(dispatch_data_iv, dispatch_data_salt), dispatch_data_encrypted); 
NSData *concatenatedNSData = DataFromDispatchData(dispatch_data_concat); 

// lets check now if the concatenation works properly 
NSString *stringFromConcatenatedNSData = [[NSString alloc]initWithData:concatenatedNSData encoding:NSUTF8StringEncoding]; 
NSLog(@"%@",stringFromConcatenatedNSData); 

non dimenticare l'aiutante-convertitore

NSData *DataFromDispatchData(dispatch_data_t data) 
{ 
    NSMutableData *result = [NSMutableData dataWithCapacity: dispatch_data_get_size(data)]; 
    dispatch_data_apply(data, ^(dispatch_data_t region, size_t offset, const void *buffer, size_t size) { 
     [result appendBytes:buffer length:size]; 
     return (_Bool)true; 
    }); 
    return result; 
} 
+2

, odoro l'ottimizzazione pre-matura. Se altri codici sono abbastanza buoni ma ancora meglio leggibili dovrebbero essere preferiti. – vikingosegundo

+0

Questo è un sacco di codice per concatenare 3 variabili. – quantumpotato

+0

@quantumpotato dipende da quanta memoria le variabili usano –