2012-09-14 16 views

Respuesta

31

utilizar un objeto NSMutableData y el método -(void)appendData:(NSData *)otherData

Editado para añadir ejemplo:

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

Cómo recuperar datos en particular de la NSMutableData. –

+0

@VineeshTPthe concatenatedData IS los datos mutables. – quantumpotato

0

Usted podría utilizar NSMutableData 's -appendData método:

NSMutableData *result = [NSMutableData data]; 

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

// result now has what you need. 

Esto se produce en los gastos generales de la utilización de los datos mutables, que puede ser más lenta & utilizar más memoria, por lo que utilizar con cuidado. En general, no desea que grandes NSData estén flotando.

-3

En primer lugar crear dos NSObjects y utilizar este método

-(void)appendData:(NSData *)otherData 

y se puso en una NSData más tarde con 3rd NSData también concatenar con el mismo método.

+0

Gracias por su ayuda. Pero soy nuevo en el iPhone y estoy un poco confundido ... ¿Pueden darme el código para unirme a estos tres NSData? Gracias de antemano –

4

Para aquellos que codifican para iOS5 y posterior. Me gustaría mostrar una buena concatenación real. ¿Por qué esas respuestas no son lo suficientemente buenas? Porque implican un uso de memoria adicional para los datos copiados. Veamos la respuesta:

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

aquí hemos asignado memoria para iv, salt y encryptedData también cada vez que añadimos una de ellas en nuestro concatenación mutable obviamente estamos copiamos a los datos mutables de nuevo. ¿Queremos estos gastos adicionales al tratar con datos de gran tamaño? Yo no.

Hay una manera de evitar este gasto innecesario de memoria - dispatch_data No voy a explicar cómo funciona, puede buscarlo en Google si lo desea. que sólo le dará un código que funcione:

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

No se olvide de la ayudante convertidor

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

Huelo la optimización pre-madura. Si otros códigos son lo suficientemente buenos pero aún mejor legibles, deberían ser preferidos. – vikingosegundo

+0

Eso es mucho código para concatenar 3 variables. – quantumpotato

+0

@quantumpotato depende de la cantidad de memoria que utilicen las variables –