Partage
  • Partager sur Facebook
  • Partager sur Twitter

Base 16 vers base 10

    22 mai 2019 à 19:37:19

    Bonjour,
    pourriez-vous m'aider svp, j'arrive pas à effectuer ma conversion:

    tHexa = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
    print("entrez un entier naturel")
    unHexa = (input("saisie de l'Hexadécimal à convert1ir "))
    k = 0
    unEntier = 0
    while len(unHexa) > 0:
        s = chr(unHexa, sys.getsizeof(unHexa)-1,1)
        position = 0
        while s not in tHexa[position]:
            position = position +1
        unEntier = unEntier + position * 16**k
        unHexa = chr(unHexa, 0,sys.getsizeof(unHexa)-1)
        k = k + 1
        print (unEntier)
    
    

    voilà l'erreur créée en console:

    C:\Users\Utilisateur\PycharmProjects\conversion\venv\Scripts\python.exe C:/Users/Utilisateur/.PyCharmCE2018.3/config/scratches/TEST2.py
    entrez un entier naturel
    saisie de l'Hexadécimal à convert1ir 0xff
    Traceback (most recent call last):
    File "C:/Users/Utilisateur/.PyCharmCE2018.3/config/scratches/TEST2.py", line 7, in <module>
    s = chr(unHexa, sys.getsizeof(unHexa)-1,1)
    NameError: name 'sys' is not defined
    
    Process finished with exit code 1


    Pourriez-vous me dire ce qui ne va pas svp ?



    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2019 à 19:50:36

      Non, je cherche pas à utiliser la fonction int()

      Je veux utiliser un algorithme

      si qq a ça en réserve ou si on pouvait m'aider à corriger le miens, se serait ccol

      Merci

      -
      Edité par Doudoudu35 22 mai 2019 à 19:53:32

      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2019 à 20:15:14

        Le message d'erreur est explicite, tu as juste oublié d'importer le module sys.

        Mais je ne sais pas ce que tu veux faire avec la fonction getsizeof, d'autant plus que la fonction chr ne prend qu'un argument et pas 3, donc même en corrigant l'import du module sys, ça va planter à la même ligne sur l'appel à chr().

        La condition du while ligne 9 ne colle pas non plus, après le mot clé in, il doit y avoir une liste, or là tu prend un élément de la liste et pas la liste entière. Tu peux juste utiliser != à la place de not in je pense.

        Difficile d'en dire plus, parce qu'en fait j'arrive pas du tout à comprendre ce que tu voulais faire en lisant ton code !

        -
        Edité par LoupSolitaire 22 mai 2019 à 20:23:41

        • Partager sur Facebook
        • Partager sur Twitter

        Blond, bouclé, toujours le sourire aux lèvres...

          22 mai 2019 à 20:20:42

          mais que puis-je utiliser à la place de chr() alors, comment puis-je corriger cela svp ?
          • Partager sur Facebook
          • Partager sur Twitter
            22 mai 2019 à 20:26:17

            Je comprend pas ce que la ligne doit faire, donc je sais pas trop quoi te conseiller.

            La variable s doit contenir quoi en principe ?

            • Partager sur Facebook
            • Partager sur Twitter

            Blond, bouclé, toujours le sourire aux lèvres...

              22 mai 2019 à 20:38:51

              J'écris avec mon second compte:

              Donc,

              Voici mon programme en pseudocode:

              afficher "Entrez un hexadécimal = "          
              saisir unHexa          
              // conversion par addition des digits multipliés par les poids         
              k ← 0 // pour les puissances         
              unEntier ← 0          
              tantque taille(unHexa) > 0           
              // extraction du dernier caractère hexa           
              s ← extraire(unHexa, unHexa.size()-1, 1)           
              // recherche de la position du caractère dans le vecteur           
              position ← 0            
              tantque s <> tHexa[position]             
              position ← position + 1           
              fintantque           
              // ajout du digit récupéré multiplié par la puissance de 16           
              unEntier ← unEntier + position * 16k           
              // on enlève le dernier caractère           
              unHexa ← extraire(unHexa, 0, unHexa.size()-1)  
              k ← k + 1         
              fintantque         
              // affichage du résultat         
              afficher "valeur décimale = ", unEntier 


              La ligne concerné:

              // extraction du dernier caractère hexa           
              s ← extraire(unHexa, unHexa.size()-1, 1)

              Merci par avance pour votre aide

              • Partager sur Facebook
              • Partager sur Twitter
                22 mai 2019 à 22:26:46

                Grosso modo, ce que tu sembles chercher est ceci :

                HEX="0123456789ABCDEF"
                n="1C8025AB"
                
                p=1
                v=0
                while n:
                    v+=HEX.find(n[-1])*p
                    p*=16
                    n=n[:-1]
                print(v)


                Tu peux écrire un dictionnaire pour extraire la valeur numérique de chaque chiffre hexa. Et on peut en fait faire bien plus simple.

                • Partager sur Facebook
                • Partager sur Twitter
                  22 mai 2019 à 23:26:36

                  Je ne suis pas sur mon PC mais j'aimerais savoir si avec ce programme, si je tape 0xff, j'aurais bien 255 qui me sera affiché ou si je dois modifier qq chose ?

                  Merci pour votre code et votre aide

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 mai 2019 à 0:15:53

                    Non il faut enlever le "0x". Si tu lis bien son code converti "1C8025AB"

                    Sinon il y a encore plus simple :

                    HEX="0123456789ABCDEF"
                    n="1C8025AB"
                     
                    v=0
                    for c in n:
                        v *= 16
                        v += HEX.find(c)
                    
                    print(v)



                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 mai 2019 à 0:24:16

                      Merci mais on m'a dit de tester en faisant 0xff => 255

                      Je souhaite obtenir le même résultat que lorsque je fais:

                      unHexa = "0xff" #ou ff
                      
                      print("la chaîne", unHexa, "vaut", int(unHexa, 16), "en hexadécimal")
                      
                      255
                      
                      
                      
                      
                      

                      Comment puis-je faire cela avec votre code svp ?

                      en entrant ff, le programme m'affiche -17

                      -
                      Edité par Doudoudu35 BIS 23 mai 2019 à 0:28:02

                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 mai 2019 à 0:33:48

                        thelinekioubeur a écrit:

                        Sinon il y a encore plus simple :

                        HEX="0123456789ABCDEF"
                        n="1C8025AB"
                         
                        v=0
                        for c in n:
                            v *= 16
                            v += HEX.find(c)
                        
                        print(v)




                        Mais il y a encore plus simple :

                        print(sum("0123456789ABCDEF".find(c)*16**k for (k,c) in enumerate("1C8025AB"[::-1])))


                        mais la question était d'implémenter au près près l'algorithme demandé et écrit en pseudo code plus haut. Si j'ai écrit n[-1] c'est que l'auteur de la question faisait allusion à l'" extraction du dernier caractère hexa" et si j'ai écrit n[:-1] c'est que le pseudo code disait "on enlève le dernier caractère" et donc ce qui reste est le slice.

                        En réalité la méthode de celui qui a posé est assez laborieuse et revient a écrire l'écriture en base 16 comme j'ai fait ci-dessus.

                        Doudoudu35 BIS a écrit:

                        en entrant ff, le programme m'affiche -17


                        Ecrit avec des majuscules FF

                        -
                        Edité par PascalOrtiz 23 mai 2019 à 0:38:14

                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 mai 2019 à 0:44:21

                          Ah bah merci, ça marche !

                          Je vais également tenter l'extraction, oui, c'était un programme laborieux, je suis allé loin dans la réflexion :)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 mai 2019 à 7:17:49

                            Penses à la méthode upper pour transformer les minuscules en majuscules :

                            >>> a = "0xff"
                            >>> a[2:]
                            'ff'
                            >>> a[2:].upper()
                            'FF'
                            


                            @Pascal : les one-liner ce n'est pas simple du tout :lol:

                            -
                            Edité par thelinekioubeur 23 mai 2019 à 7:18:41

                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 mai 2019 à 20:04:41

                              J'aurais besoin de savoir ce que cela fais en pseudocode svp ?

                              HEX="0123456789ABCDEF"
                              n="1C8025AB"
                                
                              v=0
                              for c in n:
                                  v *= 16
                                  v += HEX.find(c)
                               
                              print(v)


                              Car je suis pas sur d'avoir compris cette méthode

                              -
                              Edité par Doudoudu35 BIS 23 mai 2019 à 20:05:16

                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 mai 2019 à 20:37:09

                                N'hésite pas à ajouter des print dans le code pour inspecter le contenu des variables, c'est une méthode de debug basique, mais ça peut aussi être utile pour comprendre ce que fait un bout de code.

                                Ici la boucle itère sur les caractères de la chaîne n.

                                Pour chaque caractère, on multiplie v par 16, puis on lui ajoute l'indice auquel est placé le caractère c dans la chaîne HEX. Sachant que la chaîne HEX est formée pour que chaque caractère soit positionné à l'indice qui correspond à sa valeur en base 10 (0 est à l'indice 0, A est à l'indice 10, F à l'indice 15).

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Blond, bouclé, toujours le sourire aux lèvres...

                                  23 mai 2019 à 20:45:35

                                  Merci, mais v est à 0 au début, alors v est calculé dans quoi svp ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 mai 2019 à 21:03:25

                                    Doudoudu35 BIS a écrit:

                                    J'aurais besoin de savoir ce que cela fais en pseudocode svp ?

                                    HEX="0123456789ABCDEF"
                                    n="1C8025AB"
                                      
                                    v=0
                                    for c in n:
                                        v *= 16
                                        v += HEX.find(c)
                                     
                                    print(v)


                                    Car je suis pas sur d'avoir compris cette méthode

                                    -
                                    Edité par Doudoudu35 BIS il y a environ 1 heure


                                    Ce n'est pas si évident. C'est exactement le schéma de Horner. Son intérêt essentiel est d'éviter de recalculer à chaque fois la puissance de 16 courante.

                                    -
                                    Edité par PascalOrtiz 23 mai 2019 à 21:06:33

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      23 mai 2019 à 21:03:58

                                      Je ne comprends pas la question ?

                                      Par exemple avec "3B" :

                                      - au début, v = 0

                                      - première itération : on multiplie par 16 donc v = 0 * 16 = 0

                                      - on ajoute 3, donc v = 0 + 3 = 3

                                      - deuxième itération : on multiplie par 16, donc v = 3 * 16 = 48

                                      - on ajoute B (11) donc v = 48 + 11 = 59

                                      -
                                      Edité par thelinekioubeur 23 mai 2019 à 21:04:32

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 mai 2019 à 21:24:30

                                        C'est plus facile à comprendre avec la base 10 :

                                        def horner(n):
                                            v=0
                                            for c in n:
                                                print(v)
                                                v *= 10
                                                v += int(c)
                                            return v
                                          
                                        horner("30589627")
                                        
                                        0
                                        3
                                        30
                                        305
                                        3058
                                        30589
                                        305896
                                        3058962

                                        On peut même simplifier le code :

                                        HEX="0123456789ABCDEF"
                                        
                                        def horner(n):
                                            v=0
                                            for c in n:
                                                v = HEX.find(c)+16*v
                                            return v
                                        
                                        n="1C8025AB"
                                        
                                        print(horner(n), int(n, base=16))






                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          23 mai 2019 à 22:53:19

                                          J'ai reproduis l'exemple avec ff et voici mon résultat:

                                          Je suis censé obtenir 255 et j'obtiens 276

                                          Ais-je mal fais mon compte ?

                                          pour ce programme:

                                          HEX="0123456789ABCDEF"
                                          n="FF"
                                             
                                          v=0
                                          for c in n:
                                              v *= 16
                                              v += HEX.find(c)
                                            
                                          print(v)




                                          v multiplié par 16, cela donne 0 car 0 x 16 = 0

                                          on ajoute F donc 0 + 16 = 16
                                          on multiplie par 16 donc v 16 x 16 = 256
                                          on ajoute F soit 256 + 16 = 276

                                          -
                                          Edité par Doudoudu35 23 mai 2019 à 22:54:49

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            23 mai 2019 à 23:03:49

                                            J'obtiens 240

                                            15

                                            15 x 15

                                            225 + 15

                                            240

                                            pas 255, je comprend pas pas ou je me loupe

                                            EDIT: c bon, j'ai multiplié par 15 au lieu de 16

                                            -
                                            Edité par Doudoudu35 23 mai 2019 à 23:06:05

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              23 mai 2019 à 23:05:36

                                              La multiplication c'est par 16, pas par 15 :-°
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 mai 2019 à 23:06:56

                                                Oui, je m'en suis rendu compte juste avant que tu poste ta réponse

                                                Merci

                                                -
                                                Edité par Doudoudu35 23 mai 2019 à 23:07:11

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Base 16 vers base 10

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown