Partage
  • Partager sur Facebook
  • Partager sur Twitter

Convertir un nombre (char) d'une base à une autre

J'ai une fonction en PHP...

Sujet résolu
    16 août 2006 à 14:51:10

    Bonjour à tous ! :D
    Je débute tout juste en C, et là, je fais un petit programme où j'ai besoin d'un fonction pour passer un nombre d'une base quelconque à une autre base quelconque (et même supérieur à 36 et 62, puisque les caractères à utiliser seraient définis dans une chaîne de caractères !). J'avais déjà utilisé une fonction PHP qui fait exactement la même chose Je me suis dit que PHP ressemblait assez au C pour pouvoir créer l'équivalent C de cette fonction... mais ça s'est révélé plus compliqué que je ne le pensais et j'aurais besoin de l'aide de quelqu'un de plus expérimenté :-)...

    V'là la fonction en php ;)

    function base_convert_perso ($numstring, $frombase, $tobase) {

       $chars = "0123456789abcdefghijklmnopqrstuvwxyz";
       $tostring = substr($chars, 0, $tobase);

       $length = strlen($numstring);
       $result = '';
       for ($i = 0; $i < $length; $i++) {
           $number[$i] = strpos($chars, $numstring{$i});
       }
       do {
           $divide = 0;
           $newlen = 0;
           for ($i = 0; $i < $length; $i++) {
               $divide = $divide * $frombase + $number[$i];
               if ($divide >= $tobase) {
                   $number[$newlen++] = (int)($divide / $tobase);
                   $divide = $divide % $tobase;
               } elseif ($newlen > 0) {
                   $number[$newlen++] = 0;
               }
           }
           $length = $newlen;
           $result = $tostring{$divide} . $result;
       }
       while ($newlen != 0);
       return $result;
    }




    Et ce que je me suis risqué à faire en C (oui je sais, ça pique les yeux (mais en même temps, ça fais à peine deux semaines que j'apprends le C ^^ ))

    //...

    #define ALL_CHARS "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ :;<=>\?@[\\]^_`{|}~"

    //...


    void base_convert (char numstring[], int frombase, int tobase)
    {
        char tostring[] = ALL_CHARS, result[] = "", finalResult[] = "", tostringSpec[] = "";
        char* suiteAllChars = NULL;
        unsigned long length = 0, number[100] = {0}, divide = 0, newlen = 0;
        int i = 0, positionCarac;
       
        tostring[tobase] = '\\0';
       
        length = strlen(numstring);
       
        for (i = 0; i < length; i++) {
            suiteAllChars = strchr(ALL_CHARS, numstring[i]);
            positionCarac = strlen(ALL_CHARS) - strlen(suiteAllChars);
            number[i] = positionCarac; // position de numstring[i] dans ALL_CHARS
        }
       
        do {
            for (i = 0; i < length; i++) {
                divide = divide * frombase + number[i];
                if (divide >= tobase)
                {
                    number[newlen++] = (divide / tobase);
                    divide = divide % tobase;
                }
                else if (newlen > 0)
                {
                    number[newlen++] = 0;
                }
            }
            length = newlen;
            tostringSpec[0] = tostring[divide]; //comme je ne suis pas arrivé à concatener, j'affiche tout de suite le résultat
            printf("%s", tostringSpec);
        } while (newlen != 0);
    }

    //...




    Voilà ! Merci d'avance ! :D
    • Partager sur Facebook
    • Partager sur Twitter
      16 août 2006 à 15:30:21

      traduire un int en char:
      char truc;
      int bidule;
      truc = (char)bidule;


      et l'inverse

      char truc;
      int bidule;
      bidule = (int)truc;


      (enfin il me semble...(sa marche quand je compile en C++ en tous cas))
      • Partager sur Facebook
      • Partager sur Twitter
        16 août 2006 à 15:45:33

        Ah... merci... mais... ça ne m'aide pas beaucoup ^^ lol en fait, tout le calcul est un problème puisque le résultat est faux :(
        • Partager sur Facebook
        • Partager sur Twitter
          18 août 2006 à 0:11:43

          Personne ne peut m'aider? :( Je n'arrive vraiment pas à passer cette fonction php en C :'(
          • Partager sur Facebook
          • Partager sur Twitter
            18 août 2006 à 15:27:36

            Tu as oublié de remettre divide et newlen à 0 après le do.

            Voilà le code C équivalent au code PHP.

            Secret (cliquez pour afficher)
            #include <stdio.h>
            #include <string.h>
            #include <conio.h>

            #define ALL_CHARS "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ :;<=>\?@[\\]^_`{|}~"

            void base_convert (char numstring[], int frombase,unsigned int tobase);

            int main(void)
            {
                    base_convert("753f",16,10);
                    getch();
                    return 0;
            }


            void base_convert (char numstring[], int frombase,unsigned int tobase)
            {
                char tostring[] = ALL_CHARS;
                    char result[100] = ""
                char* suiteAllChars = NULL;
                unsigned long length = 0, number[100] = {0}, divide = 0, newlen = 0;
                unsigned int i = 0, positionCarac;
                    char buffer;
               
                tostring[tobase] = '\0';
               
                length = strlen(numstring);
               
                for (i = 0; i < length; i++)
                    {
                    suiteAllChars = strchr(ALL_CHARS, numstring[i]);
                    positionCarac = strlen(ALL_CHARS) - strlen(suiteAllChars);
                    number[i] = positionCarac; // position de numstring[i] dans ALL_CHARS
                }

                    // Sert à stocker les caractères dans le résultat
                    positionCarac=0;

                    do
                    {
                            divide=0;
                            newlen=0;

                    for (i = 0; i < length; i++)
                            {
                        divide = divide * frombase + number[i];
                        if (divide >= tobase)
                        {
                            number[newlen++] = (divide / tobase);
                            divide = divide % tobase;
                        }
                        else if (newlen > 0)
                        {
                            number[newlen++] = 0;
                        }
                    }
                    length = newlen;       
                            result[positionCarac]=tostring[divide];
                    printf("%c", result[positionCarac]);
                            positionCarac++;

                } while (newlen != 0);
                    printf("\n");

                   
                    // On calcule le miroir de la chaine result
                    length=strlen(result);
                    for(i=0;i<length/2;i++)
                    {
                            buffer=result[i];
                            result[i]=result[length-i-1];
                            result[length-i-1]=buffer;
                    }
                    // Affichage du résultat final
                    printf("%s\n",result);

            }
            • Partager sur Facebook
            • Partager sur Twitter
              18 août 2006 à 17:08:50

              Ouai ! Super ! Merci Jano Lapin !
              • Partager sur Facebook
              • Partager sur Twitter
                18 août 2006 à 18:23:32

                Pourrais-tu mettre résolu à ton sujet si tu n'as plus de problème ?
                • Partager sur Facebook
                • Partager sur Twitter
                  18 août 2006 à 19:21:26

                  Ah oui pardon ^^ J'oublie une fois sur deux :p
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Convertir un nombre (char) d'une base à une autre

                  × 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