BiC_Hex2Dec

Fonction Catégorie Version
BIC 02 BiC_Hex2Dec Fonction de Convertion 1.0 - Janvier 2007

Description

But Convertit un nombre hexadécimal en décimal. Par exemple "1E" est transformé en 30
Prototype (BiC_Dec2Hex Nombre_Hexa)
Argument Nombre_Hexa - Le nombre hexadécimal à convertir - Chaîne ou Entier -
Retours Le nombre en système décimal - entier -
Var. globales Néant
Description Convertit un nombre entier du système hexadécimal (base 16) en nombre du système décimal (base 10).
Notes Le nombre doit être un entier positif.
Il peut être donné sous forme de chaîne ou d'entier.
Attention : Vous aurez un résultat aberrant, sans message d'erreur, si :
- Le nombre est négatif.
- Le nombre ne correspond pas à un nombre hexadécimal.
La fonction BIC_Dec2Hex fait le contraire de cette fonction.
Exemples

(BiC_Hex2Dec "2D5")   retourne  725

(BiC_Hex2Dec "2d5")   retourne  725  

(BiC_Hex2Dec "4E20")  retourne  20000

(BiC_Hex2Dec 1000)    retourne  4096

(BiC_Hex2Dec 0)       retourne  0

Autres exemples	aux résultats aberrants	

(BiC_Hex2Dec -50)    retourne   -688

(BiC_Hex2Dec "AZE")  retourne   3134

La fonction


   1-   (defun BiC_Hex2Dec (*NbHex / Result Cpt1 Str1) 

   2-       (if (= (type *NbHex) 'INT)
   3-           (setq *NbHex (itoa *NbHex))
   4-       )
   5-       (setq Result 0
   6-             Cpt1 0)
   7-       (while (and	
   8-                 (= (type *NbHex) 'STR)	
   9-                 (< Cpt1 (strlen *NbHex))
  10-              )
  11-              (setq Cpt1 (1+ Cpt1)	
  12-                    Str1 (strcase (substr *NbHex Cpt1 1))
  13-                    Result (+ (lsh Result 4)
  14-                               (- (ascii Str1)
  15-	 	                           (if (<= Str1 "9") 48 55)
  16-		                        )
  17-		                     )			
  18-              )			
  19-       )	
  20-  )
Ligne 2 :   Si le nombre à convertir est un nombre entier,
Ligne 3 :   le transformer en chaîne.
Ligne 5 :   Initialisation de Result
Ligne 6 :      et du compteur Cpt1
Ligne 7 :   Boucle tant que
Ligne 8 :     *NbrHex est une chaîne
Ligne 9 :     et que Cpt1 est inférieur à la longueur de *NbHex
Ligne 11 :       Incrémente le compteur de boucle de 1 
Ligne 12 :       Donne à Str1 la valeur de la majuscule de la lettre numéro Cpt1 de *NbHex
Ligne 13 :       et à Result la somme de la multiplication par 16 de la boucle précédente
Ligne 14 :       diminué de la différence entre la valeur ASCII de Str1 et
Ligne 15 :            48 si Str1 est inférieur ou égal à 9, sinon 55
Ligne 19 :  fin de boucle while - remonte à la ligne 7 si Cpt1 est inférieur au nombre de 
                caractères de *NbHex


Exemple : Nombre "2D5" à traduire en décimal.

1ère boucle:  Ligne 11  Cpt1 = 1  L. 12  Str1 ="2"  L. 13 : 0   - Result= 0 +(50-48) = 2
2ème boucle:  Ligne 11  Cpt1 = 2  L. 12  Str1 ="D"  L. 13 : 32  - Result= 32 +(68-55) = 45
3ème boucle:  Ligne 11  Cpt1 = 3  L. 12  Str1 ="5"  L. 13 : 720 - Result= 720 +(53-48)= 725

strlen : retourne la longueur de la chaîne.
strcase : ici, le caractère retourné de la chaîne *NbHex est transformé en majuscule s'il est en minuscule.
substr : ici, extrait de la chaîne *NbHex le caractère correspondant au numéro donné par le compteur Cpt1.
lsh : décalage logique, ici, de 4 bits vers la gauche. Equivaut à multiplier par 16 le résultat précédent.
ascii : retourne le code ASCII d'un caractère. >> (ascii "A") donne 65 (Correspond à ASC en basic)