2009-12-29 4 views
0

Quelqu'un peut-il m'aider? J'ai un NSString avec @"12.34" et je veux le convertir en NSString avec le même nombre flottant, mais en format à virgule flottante binaire 32bits simple précision IEEE-754: comme @"\x41\x45\x70\xa4" (avec des caractères hexa) ou @"AEp¤" ... Je suis c'est sûr que c'est quelque chose de facile mais après de nombreuses heures de lecture du document sans trouver de solution ...iPhone SDK: NSString NSNumber IEEE-754

Merci!

+0

Pour être clair: Sur ce site vous pouvez trouver un IEEE-754 convertisseur à virgule flottante DECIMAL à virgule flottante à 32 bits et représentations hexadécimaux 64 bits: http: // babbage.cs.qc.edu/IEEE-754/Decimal.html Ce dont j'ai besoin est un NSString qui contient la représentation ASCII du flottant contenu dans le NSString passé. '@ "12.34"' à: '@ "AEp¤"' ou '@ "\ x41 \ x45 \ x70 \ xa4"' – LeBelge

+0

REMARQUE: si je fais "float fnumber = [myNSString floatValue];" quand je fais un débogage, je peux voir dans le navigateur de mémoire que les 4 premiers octets sont: "a4 70 45 41". Comment puis-je extraire ces octets? getBytes: maxLength: usedLength: encodage: options: plage: remainingRange: ?? – LeBelge

Répondre

1

Comme Yuji mentionné, ce n'est pas une bonne idée de coder pour une séquence d'octets arbitraire dans une NSString (même si elle peut contenir des octets nuls), comme les transformations d'encodage peuvent (et probablement vont) détruire votre séquence d'octets. Si vous voulez accéder aux octets bruts d'un flottant, vous pouvez envisager de les stocker en tant qu'objet NSData (bien que je vous suggère de réfléchir à vos raisons pour le vouloir d'abord). Pour ce faire:

NSString *string = @"10.23"; 
float myFloat = [string floatValue]; 
NSData *myData = [[NSData alloc] initWithBytes:&myFloat length:sizeof(myFloat)]; 
+0

Cela ne devrait-il pas être initWithBytes: & myFloat ... '? –

+0

Merci Mike! Je dois maintenant inverser la séquence d'octets! Quelqu'un a une idée? – LeBelge

+0

L'avez fait avec une'NSMutableData 'et une boucle'for'. – LeBelge

0

Si vous voulez obtenir les octets bruts d'un flotteur, vous pourriez jeter, comme ceci:

NSString *str = @"12.34"; 
float flt = [str floatValue]; 
unsigned char *bytes = (unsigned char *)&flt; 
printf("Bytes: %x %x %x %x\n", bytes[0], bytes[1], bytes[2], bytes[3]); 

Cependant l'ordre dans lequel ces octets sont stockés dans le tableau dépend de la machine. (Voir http://en.wikipedia.org/wiki/Endianness). Par exemple, sur mon iMac Intel il imprime: "Bytes: a4 70 45 41".

Pour créer une nouvelle NSString à partir d'un tableau d'octets, vous pouvez utiliser initWithBytes:length:encoding:

+1

Ce n'est pas une bonne idée de mettre une séquence d'octets arbitraire dans un 'NSString', car un' NSString' ne conserve pas une séquence d'octets telle quelle, il peut changer les encodages en interne, ce qui peut détruire la séquence d'octets sans changer représentation textuelle. Et je ne suis pas sûr si un 'NSString' peut contenir' \ x00'. Je recommanderais d'utiliser NSData à la place. – Yuji