2010-08-01 14 views
17

tengo el siguiente fragmento de código:stringWithUTF8String falla, pero sólo a veces

NSData *data = [NSData dataWithContentsOfFile:filePath options:0 error:&fileError]; 
NSString *recipe = @""; 
if (fileError == nil) { 
    recipe = [NSString stringWithUTF8String:[data bytes]]; 
    NSLog(@"Converted Recipe as: %@",recipe); 
    NSLog(@"Original Data was: %@",data); 
} else { 
    NSLog(@"Error reading file: %@", [fileError localizedDescription]); 
} 

El problema es que a veces el stringWithUTF8String devuelve un valor nulo y, a veces devuelve correctamente el contenido del archivo ... El archivo MISMO. Algunas veces funciona y otras no. Aquí hay un fragmento del registro cuando no lo hace ... Lo que significa para mí que el archivo leído funciona, pero por alguna razón la conversión ha fallado esta vez. Si lo hago de nuevo (esto se denomina como el resultado de un tableView didSelectRowAtIndexPath: Así que sólo puede hacer clic en una fila diferente y luego volver a éste

2010-08-01 16:14:29.031 RecipeBrowse[52056:207] Converted Recipe as: (null) 
2010-08-01 16:14:29.037 RecipeBrowse[52056:207] Original Data was: <426c6163 6b656e65 64204361 626f2046 69736820 5461636f 730a0a49 4e475245 4449454e 54533a0a 0a2d200a 0a0a4d45 54484f44 3a0a0a42 4c41434b 454e4544 20434142 4f204649 53482054 41434f53 

Alguna idea de cómo hacer esto más fiable.? ?

+3

Regrese y lea los documentos sobre el manejo de errores. NUNCA pruebe si el error no es nulo; SIEMPRE pruebe el valor de retorno (datos en este caso) en su lugar. –

Respuesta

32

+stringWithUTF8String: se asume que su entrada es una cadena terminada en nulo, pero NSData no pone ningún terminador en particular allí. en su lugar, crear su cadena mediante -initWithBytes:length:encoding:, ya que se conoce la longitud de los datos.

+6

O 'initWithData: encoding:'. – Wevah

+0

+1 @Wevah: Es cierto, me perdí esa. – JWWalker

+0

¡Brillante, gracias! Eso parece haberlo aclarado. –

5

Tuve el mismo problema, initWithData: los datos funcionan para mí

- (NSString *)base64String { 
    NSData * data = [UIImagePNGRepresentation(self) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength]; 
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
} 
Cuestiones relacionadas