Domanda Memorizzare e recuperare il valore long lungo non firmato da / a NSString


Ho un valore long long unsigned che voglio memorizzare in un NSString e recuperare dalla stringa.

Inizialmente ho il valore in un NSNumber e sto usando questo per ottenere la stringa

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]];

dove myNum è un NSNumber.

Per recuperare il NSNumber dal NSString devo prima ottenere il valore long long unsigned. Ma non esiste alcun metodo nella classe NSString per farlo (ne abbiamo solo uno per ottenere il valore long long, non il long long value unsigned).

Qualcuno può dirmi come posso recuperare il valore in una variabile NSNumber.

Grazie.


23
2017-07-25 08:55


origine


risposte:


Ci sono molti modi per farlo. Quello che segue è il più pragmatico:

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]];

// .. code and time in between when numStr was created
// .. and now needs to be converted back to a long long.
// .. Therefore, numStr used below does not imply the same numStr above.

unsigned long long ullvalue = strtoull([numStr UTF8String], NULL, 0);

Questo rende alcune supposizioni ragionevoli come numStr conterrà solo cifre numeriche e contiene un valore long lungo non valido 'valido'. Uno svantaggio di questo approccio è quello UTF8String crea ciò che essenzialmente equivale a [[numStr dataUsingEncoding:NSUTF8StringEncoding] bytes], o in altre parole qualcosa sulla falsariga di 32 byte di memoria autorelitta per chiamata. Per la stragrande maggioranza degli usi, questo non è un problema come sempre.

Per un esempio di come aggiungere qualcosa di simile unsignedLongLongValue a NSString è molto veloce e non usa la memoria autorizzata come effetto collaterale, dai un'occhiata alla fine della mia (lunga) risposta a questa domanda SO. In particolare l'implementazione di esempio di rklIntValue, che richiederebbe solo piccole modifiche da implementare unsignedLongLongValue.

Maggiori informazioni riguardo strtoull può essere trovato nella sua pagina man.


57
2017-07-25 09:24