2011-05-05 12 views
5

¿Por qué el siguiente código produce el registro en la parte inferior? Aquí es el anomaly- mi segundo NSLog debe imprimir la chrStr pero produce nada, vacío, que se verifica por este comando de depuración:¿Por qué este NSString creado a partir de un objeto NSData no puede mostrar que tiene contenido?

(BGF) po chrStr

objeto devuelve Descripción vacío

Sin embargo, el tercer NSString donde vuelvo a convertir NSString en NSData OBJETO muestra los datos, el mismo valor que en el primer NSLog, como debería. Esto me indicaría que chrStr debe tener contenido real. Pero parece no ser así desde el NSLOG o el comando po. Por qué ?


NSString *login; 
NSString *pass; 


// Purpose: NSString *loginString = [NSString stringWithFormat:@"\000%@\000%@", login, pass];  
login = @"Loginname";  // text string1 
pass = @"Password";   // text string2 

// convert text strings to data objects 
NSData *subData1 = [login dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *subData2 = [pass dataUsingEncoding:NSUTF8StringEncoding]; 

// embed a NULL into new NSData object 
NSMutableData *data = [NSMutableData data]; 
unsigned char zeroByte = 0; 
[data appendBytes:&zeroByte length:1]; 

// append string1, NULL, string2 to data object 
[data appendData:subData1]; 
[data appendBytes:&zeroByte length:1]; 
[data appendData:subData2]; 
NSLog(@"1.NSData: %@", data);     // print data object 

// create a character string from data object 
NSString *chrStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSLog(@"2.NSString: %@", chrStr);    // print character string 

// create data object from string object 
NSData *chrData = [chrStr dataUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"3.NSDATA: %@", chrData);    // print data object 

Produce: [1071: 207] 1.NSData: 004c6f67 696e6e61 6d650050 61737377 6f7264

[1071: 207] 2.NSString:

[1071: 207] 3.NSDATA: 004c6f67 696e6e61 6d650050 61737377 6f7264


Esto es un verdadero misterio para mí. Si chrStr está vacío, 3-NSDATA no pudo mostrar su información, ¡pero lo hace!

¿Qué estoy tratando de lograr? Bueno, consulte mi primera línea de comentarios: // propósito:

Esa línea cuando está descomentada produce una advertencia, aunque realmente funciona, así que estaba tratando de hacerlo de otra manera que me permitió tener una compilación limpia. Si ves una mejor manera de lograr ese objetivo, yo todos los ojos y oídos. Pero, por favor, no se fije en por qué esa cadena @ "\ 000% @ \ 000% @" es necesaria, empiece aceptando que sí lo es. Gracias.

Respuesta

3

En C (y, por lo tanto, objetivo-c), se utiliza un byte nulo para representar el final de una cadena. Cuando crea el objeto de cadena, toma todos los datos que le ha dado sin analizar, por lo que puede convertirlo nuevamente a datos. Sin embargo, cuando visualiza la cadena, el sistema lee la cadena hasta el primer byte nulo, que es el primer byte. Por lo tanto, la cadena contiene datos, pero cualquier función del sistema que lea byte por byte en lugar de usar las cadenas devueltas, la longitud pensará que está vacía. Cuando trabaje con caracteres no visualizables, intente utilizar objetos de datos sobre objetos de cadena tan a menudo como sea posible.

Cuestiones relacionadas