Convertion Hexa

LastikoLastiko Membre
22:14 modifié dans API UIKit #1
Voila j'ai un autre soucis ( pour changer )

dans les pref de l'application , j'ai un PSTextField ou je rentre une valeur ( par exemple 31999 ) , je dois ensuite récupérer cette valeur en hexa soit 0x7CFF

une idée  ?

Réponses

  • jpimbertjpimbert Membre
    22:14 modifié #2
    Je ne comprends pas la question. Si la valeur est récupérée dans une variable entière elle est forcément codée en binaire (et donc en hexa).
  • Eric P.Eric P. Membre
    22:14 modifié #3
    Bonjour,

    Si vous voulez récupérer dans une NSString la valeur en héxa, il y a la commande : stringWithFormat:@%X.

    Eric.
  • LastikoLastiko Membre
    22:14 modifié #4
    je vais tenter d'etre plus precis  de 31999 je dois arriver a 2 données qui auront pour valeur 0x7C et 0xFF

  • jpimbertjpimbert Membre
    22:14 modifié #5
    Si la variable qui contient 31999 (de type int) est "valeur". Et si on veut la première partie dans "octet2" et la seconde dans "octet1" (toute les deux de type int)
    octet2 = (valeur &gt;&gt; 8 ) &amp; 255 ;<br />octet1 = valeur &amp; 255 ;
    

  • LastikoLastiko Membre
    22:14 modifié #6
    merci jp je vais tester ca
    ;-)
  • Eric P.Eric P. Membre
    22:14 modifié #7
    Donc ma réponse n'était pas bonne.
    Mais au moins j'ai essayé.

  • LastikoLastiko Membre
    22:14 modifié #8
    Eric rhooooooo je sais pas , mais la reponse de jp m'a l'air completement correspondre a mon besoin :D
  • schlumschlum Membre
    22:14 modifié #9
    dans 1241978053:

    Si la variable qui contient 31999 (de type int) est "valeur". Et si on veut la première partie dans "octet2" et la seconde dans "octet1" (toute les deux de type int)
    octet2 = (valeur &gt;&gt; 8 ) &amp; 255 ;<br />octet1 = valeur &amp; 255 ;
    



    Dans le cas des opérateurs binaires, on bosse plus volontiers avec des valeurs hexa (bien plus lisible !) :P

    octet2 = (valeur &gt;&gt; 8 ) &amp; 0xFF ;<br />octet1 = valeur &amp; 0xFF ;
    
  • AliGatorAliGator Membre, Modérateur
    22:14 modifié #10
    Oui, mais gardez bien en tête (surtout Lastiko pour qui je suis pas sûr que ce soit clair vu comment la question était posée) que l'hexa n'est qu'une représentation parmi d'autres d'un nombre !
    Pour moi la question n'était pas bonne : le truc n'est pas de convertir ton nombre en hexa : l'affichage hexa n'est qu'une représentation du nombre, comme si tu demandais d'afficher un nombre avec des espaces entre les milliers ou pas... ce n'est que pour le rendre plus lisible pour un contexte donné.

    Mais toi ce que tu veux faire c'est décomposer ton nombre en octets, sa représentation octet par octet.
    Après que tu écrives sur ton papier ou dans tes NSLogs ces octets en hexa ou en décimal ou en binaire pour vérifier que tout se passe bien... ça change rien. 32 en décimal, 0x20 en hexa, o040 en octal... tout ça c'est du pareil au même :P

    En fait tu parlais de représentation hexa parce qu'il se trouve que cette représentation, comme la représentation binaire (qui est cependant moins lisible pour ton cas), permet ensuite facilement d'isoler les octets. Si un nombre est représenté en hexa par 0xABCD, il est facile de voir que les octets qui le composent sont 0xAB et 0xCD, autrement dit 171 et 205 en décimal. Mais tu n'es pas obligé de passer par cette représentation pour décomposer ton nombre en octets individuels, comme te l'a montré jp :P Tu peux même totalement t'en passer, et utiliser les décalages comme il te le montre pour isoler les octets de ton nombre.
  • schlumschlum Membre
    22:14 modifié #11
    Tout a fait d'accord avec Ali... Il y a d'ailleurs même les problèmes d'endianness...

    Le premier octet de 31999 ne sera pas le même sur une machine Intel et sur une machine PPC par exemple.
  • LastikoLastiko Membre
    mai 2009 modifié #12
    en tout cas merci pour les explications , mon probleme est que je suis pas sur et certain que la machine accepte les commandes si elle sont pas comme elle les attends , enfin j'ai pas tester non plus ....

    dans 1241990395:

    Tout a fait d'accord avec Ali... Il y a d'ailleurs même les problèmes d'endianness...

    Le premier octet de 31999 ne sera pas le même sur une machine Intel et sur une machine PPC par exemple.


    par contre la , j'aimerais bien comprendre ? c'est peut etre bon a savoir pour le prochain prog


    ......................
    je viens de tester
    Alors effectivement si je fais comme expliqué plus haut ca marche nikel
    int&nbsp; DeviceHex = 31999 ;<br />	int DeviceHexa1 = (DeviceHex&nbsp; &gt;&gt; 8 ) &amp; 255;<br />	int DeviceHexa2 = DeviceHex&nbsp;  &amp; 255;
    



    Par contre dés que je veux utiliser le Setting Bundle ou je rentre cette valeur attendu ( 31999 ici dans l'exemple ) , bon la ca marche carrément pas comme je veux

    la valeur je la récupére comme cela :

    Device_Master_preference = [[NSUserDefaults standardUserDefaults] stringForKey:@&quot;Device_Master_preference&quot;];<br />	[[NSUserDefaults standardUserDefaults] synchronize];
    



    et ensuite ( c'est peut etre la mon erreur )
    int DeviceHex = Device_Master_preference;<br />	int DeviceHexa1 = (DeviceHex&nbsp; &gt;&gt; 8 ) &amp; 255;<br />	int DeviceHexa2 = DeviceHex&nbsp;  &amp; 255;
    


    la le resultat est 55344 , ( bon pour la bonne nouvelle la machine l'accepte mais bon :D c'est un coup de pot )

    je veux bien comprendre le pourquoi du comment 
  • jpimbertjpimbert Membre
    22:14 modifié #13
    C'est parce que tu récupères ta valeur dans une chaà®ne de caractères et que tu l'utilises ensuite comme un entier ; le compilateur ne t'engueule pas quand tu fais ça ?
    Il faut utiliser la méthode intValue sur la NSString que tu récupères pour faire la conversion de la chaà®ne de caractères vers un entier :
    int DeviceHex = [Device_Master_preference intValue];
    

  • schlumschlum Membre
    mai 2009 modifié #14
    http://fr.wikipedia.org/wiki/Endianness

    Bonne lecture  :P

    En gros, garde en tête que ton code :
    octet2 = (valeur &gt;&gt; 8 ) &amp; 255 ;<br />octet1 = valeur &amp; 255 ;
    


    Ne donne pas des octets ordonnés tels qu'ils sont en mémoire, mais plutôt des coefficients en base 256...
    (c'est d'ailleurs en général le genre de code utilisé pour sérialiser un nombre de manière endian-safe).
  • LastikoLastiko Membre
    22:14 modifié #15
    dans 1242022334:

    C'est parce que tu récupères ta valeur dans une chaà®ne de caractères et que tu l'utilises ensuite comme un entier ; le compilateur ne t'engueule pas quand tu fais ça ?
    Il faut utiliser la méthode intValue sur la NSString que tu récupères pour faire la conversion de la chaà®ne de caractères vers un entier :
    int DeviceHex = [Device_Master_preference intValue];
    



    Ok ca marche :P
    Ben j'avais juste un warning

    En tout cas merci beaucoup

    M'en vais lire ton wiki Schlum
Connectez-vous ou Inscrivez-vous pour répondre.