2009-07-25 12 views
22

Tengo un valor largo sin signo que deseo almacenar en un NSString y recuperarlo de la cadena.Almacenamiento y recuperación de valor largo sin firmar a/desde NSString

Inicialmente tienen el valor en un NSNumber y estoy usando esto para conseguir la cadena

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

donde myNum es un NSNumber.

Para recuperar NSNumber de NSString, primero tengo que obtener el valor largo sin signo. Pero no hay un método en la clase NSString para hacer eso (solo tenemos uno para obtener el valor largo largo, no el valor largo sin signo).

¿Puede alguien decirme cómo puedo recuperar el valor en una variable NSNumber?

Gracias.

Respuesta

56

Hay muchas maneras de lograr esto. El siguiente es el más pragmático:

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

Esto hace algunas suposiciones razonables, tales como numStr solo contendrán dígitos numéricos y contiene un valor de largo 'válida' de largo sin signo. Un inconveniente de este enfoque es que UTF8String crea lo que esencialmente equivale a [[numStr dataUsingEncoding:NSUTF8StringEncoding] bytes], o en otras palabras, algo así como 32 bytes de memoria autorretractada por llamada. Para la gran mayoría de los usos, esto no es ningún problema.

Para un ejemplo de cómo añadir algo como unsignedLongLongValue a NSString que es a la vez muy rápido y utiliza ninguna memoria autoreleased como efecto secundario, echar un vistazo al final de mi respuesta (largo) a this SO question. Específicamente, la implementación de ejemplo de rklIntValue, que requeriría solo modificaciones triviales para implementar unsignedLongLongValue.

Puede encontrar más información sobre strtoull en su página man.

+1

Excelente respuesta. También podría simplemente leer los caracteres en una cadena C temporal local (ya que los caracteres son todos dígitos, no hay problemas UTF-8 o Unicode) y luego usar strtoull, lo que evitaría el inconveniente descrito, pero sería una muy caso raro en el que su inconveniente fue un problema real en la práctica. –

+0

no hay método unsignedLongLongValue para el objeto NSString – Gargo

+0

Para solicitar asistencia para leer valores sin firmar de NSString, visite http://bugreport.apple.com y archive un engaño de radar: // 2264733 contra el componente 'Fundación | X'. –

Cuestiones relacionadas