Funzione di conversione numero in altra base

Ho ritrovato questa funzione di conversione dati numerici da basi comprese fra 2 e 36.

In effetti è poco di più di una esercitazione in quanto il numero di conversioni possibili va ben oltre le quattro abitualmente e comunemente utilizzate:

  1. binaria
  2. ottale
  3. decimale
  4. esadecimale

La tecnica adottata per la conversione di un numero in un'altro abitualmente si poggia su continue conversioni da ascii a numerico e da numerico a carattere con sottrazione / aggiunta di valori.

In effetti io invece ho utilizzato direttamente una stringa di tutti i caratteri ascii "messi in fila" tutti di seguito senza la necessità di fare (sempre rischiose) operazioni di conversione da numero a carattere o da carattere a numero.

Tale stringa fornisce sia l'esponente da utilizzare per la trasformazione in numero base 10 del valore in input che il valore posizionale di ciascun elemento del valore in output.

La funzione è divisa sostanzialmente nelle parti:

  • controllo validità valore in input / parametri
  • trasformazione in valore base 10 del valore indicato come parametro
  • conversione in altra base

Magari a qualcuno farà piacere.

Progetto VB.NET
Progetto C#

/*
* Created by SharpDevelop.
* User: luciano
* Date: 20/10/2003
* Time: 21.13
*/

using System;

namespace ProvaModuliCs
{
     public class ClsFunction
    {
          public ClsFunctions()
         {
         }
         public static string ConvertAny2Any(string valueIn, int baseIn, int baseOut)
        {
              string result = "Errore";

              valueIn = valueIn.ToUpper();
              const string codice = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

              // test per limite errato sulle basi in input e/o in output
             if ((baseIn < 2) || (baseIn > 36) ||
                  (
baseOut < 2) || (baseOut > 36))
                            return result;

             if (valueIn.Trim().Length == 0)
                           return result;

             // se baseIn e baseOut sono uguali la conversione è già fatta!
             if (baseIn == baseOut)
                          return valueIn;

             // determinazione del valore totale
             double valore = 0;
             try
             {     

                   // se il campo è in base 10 non c'è bisogno di calcolare il valore
                  
if (baseIn == 10)
                       valore = double.Parse(valueIn);
                  else
                  {
                        char[] c = valueIn.ToCharArray();

                        // mi serve per l'elevazione a potenza e la trasformazione
                        // in valore base 10 della cifra
                        int posizione = c.Length;

                        // ciclo sui caratteri di valueIn
                        // calcolo del valore decimale

                        for (int k = 0; k < c.Length; k++)
                        {
                              // valore posizionale del carattere
                              int valPos = codice.IndexOf(c[k]);
                              
                              // verifica per caratteri errati
                              if ((valPos < 0) || (valPos > baseIn - 1))
                                         return result;

                              posizione--;
                              valore += valPos * Math.Pow((double) baseIn, (double) posizione);
                        }
                  }
              
             
// generazione del risultato final
                 
// se il risultato da generare è in base 10 non c'è
                  // bisogno di calcoli
                  if (baseOut == 10)
                           result = valore.ToString();

                  else
                  {
                           result = "";
                           while (valore > 0)
                          {
                                int resto = (int) (valore % baseOut);
                                valore = (valore - resto) / baseOut;
                                result = codice.Substring(resto,1) + result;
                           }
                  }

             }
             catch (Exception ex)
            {
                      result = ex.Message;
             }
             return result;
       }

   }

}

Print | posted on lunedì 24 settembre 2007 11:43

Feedback

# Conversione - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 19/10/2007 23:46
Gravatar Conversione - MasterDrive.it - Information Technology Developers Community

# Convertire carattere in bit e viceversa. - MasterDrive.it - Information Technology Developers Community

Left by Pingback/TrackBack at 08/12/2007 23:16
Gravatar Convertire carattere in bit e viceversa. - MasterDrive.it - Information Technology Developers Community

# re: Funzione di conversione numero in altra base

Left by xxxxxxxxxx at 12/04/2008 13:47
Gravatar xxxxxxxxxxxx

# re: Funzione di conversione numero in altra base

Left by manuel at 09/02/2009 14:40
Gravatar scusate ma esiste una cosa identica in C?
grazie ciau

# re: Funzione di conversione numero in altra base

Left by manuel at 09/02/2009 15:20
Gravatar e se mi potete postare il code GRAZIE

# re: Funzione di conversione numero in altra base

Left by Pask at 04/12/2010 14:12
Gravatar Grazie, mi è stata molto utile!

Your comment:





 
Please add 2 and 2 and type the answer here:

Copyright © Luciano Bastianello

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski