Convertisseur de base décimale, binaire, hexadécimal, ...

Soyez le premier à donner votre avis sur cette source.

Vue 19 039 fois - Téléchargée 455 fois

Description

Ce code permet de convertir d'une base numéraire n à une base numéraire m. Certains codes existent déjà mais se limitent aux bases principales.
Celui là, en plus des bases décimales, binaires, octale et hexadécimal, permet de convertir dans n'importe quel base.

Source / Exemple :


<?php
class Numeration
{
	//Intervalles des bases de conversion prises en compte
	const MIN_BASE = 2;
	const MAX_BASE = 36;
	
	//Constantes des bases de conversion
	const DECIMAL = 10;
	const BINAIRE = 2;
	const OCTAL = 8;
	const HEXADECIMAL = 16;
	
	//Tableau d'équivalence de conversion (jusqu'à la base 36)
	private $_aConvertReference;
	
	################################################
	/**

  • Constructeur.
  • Initialise le tableau d'équivalence de conversion.
  • /
public function __construct() { $this->_aConvertReference = array( 0 => '0', 1 => '1', 2 => '2', 3 => '3', 4 => '4', 5 => '5', 6 => '6', 7 => '7', 8 => '8', 9 => '9', 10 => 'A', 11 => 'B', 12 => 'C', 13 => 'D', 14 => 'E', 15 => 'F', 16 => 'G', 17 => 'H', 18 => 'I', 19 => 'J', 20 => 'K', 21 => 'L', 22 => 'M', 23 => 'N', 24 => 'O', 25 => 'P', 26 => 'Q', 27 => 'R', 28 => 'S', 29 => 'T', 30 => 'U', 31 => 'V', 32 => 'W', 33 => 'X', 34 => 'Y', 35 => 'Z' ); } ################################################ /**
  • Permet de convertir un nombre d'une base quelconque à la base décimale.
  • @param INTEGER $iXBase La base du nombre à convertir.
  • @param INTEGER $iNumber Le nombre à convertir.
  • @param BOOLEAN $bWrite Affiche le résultat.
  • @return INTEGER Le nombre converti de la base $iXBase à la base décimale.
  • /
public function convertXBaseToDec( $iXBase, $iNumber, $bWrite = false ) { if( $iXBase < self::MIN_BASE || $iXBase > self::MAX_BASE ) exit( '<b>Fatal error !</b> $iXbase [' . $iXBase . '] must be between ' . self::MIN_BASE . ' and ' . self::MAX_BASE . '.' ); //On prépare le nombre à convertir $iNumber = ltrim( $iNumber, '0' ); $iNumber = strtoupper( $iNumber ); $iNumberLength = strlen( $iNumber ); $iResConvert = 0; //On test la possibilité de la conversion $sKeyMax = 0; for( $i=0; $i<$iNumberLength; $i++ ) if( array_search( $iNumber[$i], $this->_aConvertReference ) > $sKeyMax ) $sKeyMax = array_search( $iNumber[$i], $this->_aConvertReference ); if( $sKeyMax >= $iXBase ) exit( '<b>Fatal error !</b> Impossible to convert : $iNumber [' . $iNumber. '] contains invalid characters (not in $iXBase [' . $iXBase . ']).' ); //On converti for( $i=0; $i<$iNumberLength; $i++ ) $iResConvert += array_search( $iNumber[$i], $this->_aConvertReference ) * pow( $iXBase, ($iNumberLength - $i - 1) ); //Affichage if( $bWrite ) echo 'Résult : <b>(' . $iNumber . ')<sub>' . $iXBase . '</sub> = (' . $iResConvert . ')<sub>' . self::DECIMAL . '</sub></b><br/>'; return $iResConvert; } ################################################ /**
  • Permet de convertir un nombre de la base décimale à une base quelconque.
  • @param INTEGER $iXBase La base dans laquelle on veut convertir le nombre.
  • @param INTEGER $iNumber Le nombre à convertir.
  • @param BOOLEAN $bWrite Affiche le résultat.
  • @return INTEGER Le nombre converti de la base décimale à la base $iXBase.
  • /
public function convertDecToXBase( $iXBase, $iNumber, $bWrite = false ) { if( $iXBase < self::MIN_BASE || $iXBase > self::MAX_BASE ) exit( '<b>Fatal error !</b> $iXbase [' . $iXBase . '] must be between ' . self::MIN_BASE . ' and ' . self::MAX_BASE . '.' ); if( is_nan( $iNumber ) ) exit( '<b>Fatal error !</b> $iNumber [' . $iNumber . '] must be an integer.' ); //Initialisation des variables $i = 0; $bLastLoop = false; $aRes = array(); //Conversion $iTemp = $iNumber; $iRes = $iNumber / $iXBase; while( floor( $iRes ) != 0 || !$bLastLoop ) { if( floor( $iRes ) == 0 ) $bLastLoop = true; $aRes[$i] = $iTemp % $iXBase; $i++; $iTemp = $iRes; $iRes = $iRes / $iXBase; } $aConvertArray = array_reverse( $aRes ); $sConvertResult = ''; for( $i=0; $i< count($aConvertArray); $i++ ) $sConvertResult .= $this->_aConvertReference[$aConvertArray[$i]]; //Affichage if( $bWrite ) echo 'Résult : <b>(' . $iNumber . ')<sub>' . self::DECIMAL . '</sub> = (' . $sConvertResult . ')<sub>' . $iXBase . '</sub></b><br/>'; return $sConvertResult; } ################################################ /**
  • Permet de convertir un nombre d'une base quelconque à une base quelconque.
  • @param INTEGER $iXBaseFrom La base du nombre à convertir.
  • @param INTEGER $iXBaseTo La base dans laquelle on veut convertir le nombre.
  • @param INTEGER $iNumber Le nombre à convertir.
  • @param BOOLEAN $bWrite Affiche le résultat.
  • @return INTEGER Le nombre converti de la base $iXBaseFrom à la base $iXBaseTo.
  • /
public function convertXBaseToXBase( $iXBaseFrom, $iXBaseTo, $iNumber, $bWrite = false ) { if( $iXBaseFrom < self::MIN_BASE || $iXBase > self::MAX_BASE ) exit( '<b>Fatal error !</b> $iXbaseFrom [' . $iXBaseFrom . '] must be between ' . self::MIN_BASE . ' and ' . self::MAX_BASE . '.' ); if( $iXBaseTo < self::MIN_BASE || $iXBase > self::MAX_BASE ) exit( '<b>Fatal error !</b> $iXbaseTo [' . $iXBaseTo . '] must be between ' . self::MIN_BASE . ' and ' . self::MAX_BASE . '.' ); $iConvert1 = $this->convertXBaseToDec( $iXBaseFrom, $iNumber ); $iConvert2 = $this->convertDecToXBase( $iXBaseTo, $iConvert1 ); //Affichage if( $bWrite ) echo 'Résult : <b>(' . $iNumber . ')<sub>' . $iXBaseFrom . '</sub> = (' . $iConvert2 . ')<sub>' . $iXBaseTo . '</sub></b><br/>'; return $iConvert2; } } ?>

Conclusion :


Voila ! J'espère qu'il n'y a pas d'erreur. Si vous avez des modifications ou des remarques à apporter n'hésitez pas ;)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

N'as marche pas ce code
syl20dies
Messages postés
13
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
29 janvier 2009
-
simplement parcque des fois on connait pas la fonction qui permet de l'ecrire en 1 ligne ;-), merci pour str_pad();
ceci dit quand on passe d'un language à un autre, il est parfois plus rapide de réecrire des choses qui existent que de chercher dans un manuel parmis des miliers de fonctions plus ou moins bien documentées celle qui nous eviterait d'écrire 3 lignes basiques, il en va de même pour la politique de masquage des données dans les variables et parametres de fonctions, mais merci avous deux AlphaOrionis et jeca, j'en prend note ;-)
cs_jeca
Messages postés
341
Date d'inscription
mercredi 17 juillet 2002
Statut
Membre
Dernière intervention
14 juillet 2011
11 -
Pourquoi faire simple quand on peut faire compliqué :
<?php
$valeur = 3;
echo str_pad(base_convert(3, 10, 2), 8, '0', STR_PAD_LEFT);
//-- affiche : 00000011 -------------
?>
Dans tous les cas, les fonctions natives sont plus rapides. Et pourquoi écrire dix lignes quand une seule suffit ?
AlphaOrionis
Messages postés
12
Date d'inscription
dimanche 8 octobre 2006
Statut
Membre
Dernière intervention
29 octobre 2008
-
Je pense que le plus pratique reste de rajouter ta petite fonction.

Pour ta fonction, cette ligne est inutile : $newstr=$pstr;
$pstr est déjà une variable locale, prend juste soin de lui donner un nom unique. ;)
syl20dies
Messages postés
13
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
29 janvier 2009
-
Bonjour, l'avantage de réecrire du built-in, c'est de pouvoir le recoder si l'on veut en changer légerement le fonctionement.
Aussi je me demandais peut on editer de telles fonctions?(je suis sous windows avec easyphp)existe t'il un répertoire contenant les classes built-in, ou sont elles compilées et sont elles plus rapides en termes d'execution qu'une classe ecrite à la main qui contiendrait exactement le même code?

en l'occurence si je voulais que convertDecToXBase( 2, 3, false) retourne '00000011' et non '11' vaut'il mieux?:

1)ecrire une fonction style
function completechaine($pstr,$d){
$newstr=$pstr;
while(strlen($newstr)<$d){$newstr="0".$newstr;}
return $newstr;
}
et faire completechaine(decbin(3),8)

ou

2)
récrire une classe comme nicof3 en ajoutant un parametre pour la longueur de la chaine retournée?

Merci d'avance pour vos suggestions

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.