2012-05-06 29 views

Respuesta

28

En lugar de anexar bytes en una cadena mutable, cree una cadena utilizando los datos:

// Be sure to use the right encoding: 
NSString *result = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding]; 

Si realmente quiere colocar a través de los bytes:

NSMutableString *result = [NSMutableString string]; 
const char *bytes = [myData bytes]; 
for (int i = 0; i < [myData length]; i++) 
{ 
    [result appendFormat:@"%02hhx", (unsigned char)bytes[i]]; 
} 
+0

¿Cuál debería ser la línea doSomethingWithChar, p. si quiero agregar la representación hexadecimal del byte a un NSMutableString? – yannis

+0

¿y si el nsdata no es realmente una cadena? ¿Qué pasa si contiene 0x00 bytes? Entonces no podrá iterar a través de datos completos. –

11

actualización! Desde iOS 7, existe una nueva forma preferida de iterar a través de todos los bytes en un objeto NSData.

Debido a que un NSData ahora puede estar compuesto por varios trozos de matrices de bytes disjuntos bajo el capó, llamando [NSData bytes] a veces puede ser la memoria-ineficiente, ya que necesita para aplanar todos los trozos que subyacen en una única matriz de bytes para la persona que llama.

Para evitar este comportamiento, es mejor enumerar los bytes utilizando el método enumerateByteRangesUsingBlock: de NSData, que devolverá los rangos de los fragmentos subyacentes existentes, a los que puede acceder directamente sin necesidad de generar ninguna estructura de matriz nueva. Por supuesto, deberá tener cuidado de no hurgar de manera inapropiada en el conjunto de estilo C proporcionado.

NSMutableString* resultAsHexBytes = [NSMutableString string]; 

[data enumerateByteRangesUsingBlock:^(const void *bytes, 
            NSRange byteRange, 
            BOOL *stop) { 

    //To print raw byte values as hex 
    for (NSUInteger i = 0; i < byteRange.length; ++i) { 
     [resultAsHexBytes appendFormat:@"%02x", ((uint8_t*)bytes)[i]]; 
    } 

}];