objective-c nsstring nsnumber

objective c - Almacenamiento y recuperación de valores largos largos sin firmar de NSString



objective-c nsnumber (1)

Tengo un valor largo y largo sin firmar que quiero almacenar en un NSString y recuperar de la cadena.

Inicialmente tengo el valor en un NSNumber y lo uso para obtener la cadena

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

donde myNum es un NSNumber.

Para recuperar el NSNumber de la NSString, primero tengo que obtener el valor largo largo sin firmar. Pero no hay ningún método en la clase NSString para hacerlo (solo tenemos uno para obtener el valor largo y largo, no el valor largo y largo sin firmar).

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

Gracias.


Hay muchas maneras de lograr esto. Lo siguiente es lo 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 que algunas suposiciones razonables, como numStr , solo contendrán dígitos numéricos y contendrán un valor ''largo'' válido y sin signo ''válido''. Un inconveniente de este enfoque es que UTF8String crea lo que esencialmente equivale a [[numStr dataUsingEncoding:NSUTF8StringEncoding] bytes] , o en otras palabras, algo parecido a los 32 bytes de memoria autoreditada por llamada. Para la gran mayoría de usos, este no es un problema en absoluto.

Para ver un ejemplo de cómo agregar algo como unsignedLongLongValue a NSString que es a la vez muy rápido y que no utiliza memoria de autorlaboración, mire el final de mi (larga) respuesta a esta pregunta de SO . Específicamente la implementación de ejemplo de rklIntValue , que requeriría solo modificaciones triviales para implementar unsignedLongLongValue .

Se puede encontrar más información sobre strtoull en su página de manual.