2010-08-01 17 views
17

Ho la seguente porzione di codice:stringWithUTF8String fallisce, ma solo qualche volta

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

Il problema è che a volte lo stringWithUTF8String restituisce null e talvolta restituisce correttamente il contenuto del file ... Il file STESSO. A volte funziona e altre volte no. Ecco uno snippet dal log quando non lo fa .... Il che significa che il file letto funziona, ma per qualche motivo la conversione non è riuscita questa volta. Se lo faccio di nuovo (questo è chiamato come il risultato di un tableView didSelectRowAtIndexPath: Quindi posso solo cliccare su una riga diversa e poi tornare a questo

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 

Delle idee come renderlo più affidabile.? ?

+3

Torna indietro e leggi i documenti sulla gestione degli errori. NON testare MAI se l'errore non è zero; Verificare SEMPRE il valore restituito (dati in questo caso). –

risposta

32

+stringWithUTF8String: assumerà che il suo input è una stringa NUL-terminated, ma NSData non mette alcun terminatore particolare lì. Invece, creare la stringa utilizzando -initWithBytes:length:encoding:, dal momento che si conosce la lunghezza dei dati.

+6

Oppure 'initWithData: encoding:'. – Wevah

+0

+1 @Wevah: vero, mi mancava quello. – JWWalker

+0

Brillante, grazie! Sembra averlo chiarito. –

5

Aveva lo stesso problema, initWithData: i dati funzionano per me

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