Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Conversion décimale hexadécimale. | |
| | Auteur | Message |
---|
Tecking
Nombre de messages : 114 Age : 36 Localisation : Toulouse Date d'inscription : 30/05/2010
| Sujet: Conversion décimale hexadécimale. Mer 28 Juil 2010 - 23:04 | |
| En attendant que JACK intègre ces outils de conversion, je vous propose d'intégrer ceci : Entête : - Code:
-
DIM HEXA%, HEXA$, HEXABUF%, HEXABUF$, HEXLENGH%, HEXACONT%, HEXDECOK% LABEL HEXACODE, HEXADECO
Corps : - Code:
-
HEXACODE:
HEXLENGH% = HEXLENGH% -1 HEXA$ = ""
REPEAT HEXLENGH% = HEXLENGH% + 1 UNTIL POWER(16, HEXLENGH%) > HEXA%
FOR HEXACONT% = 1 TO HEXLENGH%
HEXABUF% = INT(HEXA%/POWER(16, HEXLENGH% - HEXACONT%))
IF HEXABUF% < 10 HEXA$ = HEXA$ + STR$(HEXABUF%) ELSE SELECT HEXABUF% CASE 10 HEXA$ = HEXA$ + "A" CASE 11 HEXA$ = HEXA$ + "B" CASE 12 HEXA$ = HEXA$ + "C" CASE 13 HEXA$ = HEXA$ + "D" CASE 14 HEXA$ = HEXA$ + "E" CASE 15 HEXA$ = HEXA$ + "F" END_SELECT END_IF
HEXA% = HEXA% - (HEXABUF% * POWER(16, HEXLENGH% - HEXACONT%))
NEXT HEXACONT%
HEXLENGH% = 0
RETURN
HEXADECO:
HEXLENGH% = LEN(HEXA$) HEXA% = 0
FOR HEXACONT% = 1 TO HEXLENGH%
HEXABUF$ = MID$(HEXA$, HEXACONT%, 1)
IF NUMERIC(HEXABUF$) = 1 HEXA% = HEXA% + (VAL(HEXABUF$) * POWER(16, HEXLENGH% - HEXACONT%)) ELSE IF HEXABUF$ = "A" HEXA% = HEXA% + (10 * POWER(16, HEXLENGH% - HEXACONT%)) HEXDECOK% = 1 END_IF IF HEXABUF$ = "B" HEXA% = HEXA% + (11 * POWER(16, HEXLENGH% - HEXACONT%)) HEXDECOK% = 1 END_IF IF HEXABUF$ = "C" HEXA% = HEXA% + (12 * POWER(16, HEXLENGH% - HEXACONT%)) HEXDECOK% = 1 END_IF IF HEXABUF$ = "D" HEXA% = HEXA% + (13 * POWER(16, HEXLENGH% - HEXACONT%)) HEXDECOK% = 1 END_IF IF HEXABUF$ = "E" HEXA% = HEXA% + (14 * POWER(16, HEXLENGH% - HEXACONT%)) HEXDECOK% = 1 END_IF IF HEXABUF$ = "F" HEXA% = HEXA% + (15 * POWER(16, HEXLENGH% - HEXACONT%)) HEXDECOK% = 1 END_IF IF HEXDECOK% = 0 MESSAGE "'" + HEXABUF$ + "' n'est pas un carractère hexadécimal" TERMINATE END_IF HEXDECOK% = 0 END_IF
NEXT HEXACONT%
RETURN
Le principe est simple : Conversion Hexa -> Décimale Copier la variable string dans HEXA$ (seul les caractères 0123456789ABCDEF sont permis). Appeller HEXADECO par un GOSUB récupérer la valeur par HEXA% sous forme numérique. Conversion Decimale -> Hexa Copier la variable numérique entière dans HEXA%. Appeller HEXACODE par un GOSUB récupérer la valeur par HEXA$ sous forme string. Petite astuce, le code ci présant et tel quel est prevu pour permettre à l'usager de modifier la longueur de HEXA$ dans le cadre d'une conversion decimale vers hexadecimale. En effet, modifier HEXLENGH% modifie la taille de HEXA$ tel que LEN(HEXA$) = HEXLENGH%. Attention cependant, si la valeur hexadécimale dépasse le nombre de caractères définit par HEXLENGH%, par soucis de résultat juste, HEXLENGH% sera redimentionné et HEXA$ ne sera pas tronqué. Seconde astuce, vous remarquerez des puissances de 16 un peux partout. modifier cette valeur, modifie la base de conversion. Ainsi remplacer "16" par "2" fait de ce convertisseur un convertisseur binaire. Faire de même avec "8" en fait un convertisseur octal. Nota : si vous voulez en faire un convertisseur base 32 ou 64, n'oubliez pas d'ajouter des valeurs apres ABCDEF... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Conversion décimale hexadécimale. Mer 28 Juil 2010 - 23:33 | |
| Plutôt que ta série de tests sur A, B, C... tu aurais pu le faire en une fois: au lieu de mettre 10 pour A, 11 pour B, 12 pour C etc. tu faisais ASC(HEXABUF$)-55, qui donne 10 pour A, 11 pour B etc... On peut quand même faire beaucoup plus court: - Code:
-
DecHex: ' conversion décimal/hexa de d, résultat vh$ (complété si utile à lh% caractères) vh$="": IF lh% < 1 THEN lh% = 1 REPEAT vh$ = MID$("0123456789ABCDEF", 16*(d/16-INT(d/16))+1, 1) + vh$: d = INT(d/16) UNTIL d <= 0 IF LEN(vh$) < lh% THEN vh$ = STRING$(lh% - LEN(vh$), "0") + vh$ RETURN
HexDec: ' conversion hexadécimal/décimal de vh$, résultat dans d d = 0 FOR k% = 1 TO LEN(vh$) d = d*16 + INSTR("0123456789ABCDEF", MID$(vh$, k%, 1))-1 NEXT k% RETURN | |
| | | Tecking
Nombre de messages : 114 Age : 36 Localisation : Toulouse Date d'inscription : 30/05/2010
| Sujet: Re: Conversion décimale hexadécimale. Mer 28 Juil 2010 - 23:44 | |
| J'ai trouvé mon maître.
16*(d/16-INT(d/16))+1 donne la retenue de la division? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Conversion décimale hexadécimale. Jeu 29 Juil 2010 - 8:01 | |
| 16*(d/16-INT(d/16)) donne le reste entier de la division d/16 (donc entre 0 et 15), +1 parce que ça servira d'index dans la chaîne "0...F". | |
| | | Tecking
Nombre de messages : 114 Age : 36 Localisation : Toulouse Date d'inscription : 30/05/2010
| Sujet: Re: Conversion décimale hexadécimale. Jeu 29 Juil 2010 - 14:17 | |
| Judicieuse remarque. Je l'ai remis à ma sauce avec contrôle des erreurs (HEXA% = 0) et reglage de la base 2 8 10 16 etc et des caractères - Code:
-
DIM HEXA%, HEXA$, HEXLENGH%, HEXCOUNT%, BASE%, BASE$ BASE% = 16 BASE$ = "0123456789ABCDEF" LABEL HEXACODE, HEXADECO
HEXA$ = MESSAGE_INPUT$("HEXA", "HEXA$ =", "0123456789ABCDEF") PRINT HEXA$ GOSUB HEXADECO PRINT HEXA% GOSUB HEXACODE PRINT HEXA$
END
HEXACODE:
HEXLENGH% = HEXLENGH% - 1 HEXA$ = ""
REPEAT HEXLENGH% = HEXLENGH% + 1 UNTIL POWER(16, HEXLENGH%) > HEXA%
IF HEXA% > 0 FOR HEXCOUNT% = 1 TO HEXLENGH% HEXA$ = HEXA$ + MID$(BASE$, INT(HEXA%/POWER(BASE%, HEXLENGH% - HEXCOUNT%)) + 1, 1) HEXA% = HEXA% - INT(HEXA%/POWER(BASE%, HEXLENGH% - HEXCOUNT%)) * POWER(BASE%, HEXLENGH% - HEXCOUNT%) NEXT HEXCOUNT% ELSE IF HEXLENGH% = 0 HEXLENGH% = 1 END_IF HEXA$ = STRING$(HEXLENGH%, "0") END_IF
HEXLENGH% = 0
RETURN
HEXADECO:
HEXLENGH% = LEN(HEXA$) HEXA% = 0
FOR HEXCOUNT% = 1 TO HEXLENGH% HEXA% = HEXA% * BASE% + INSTR(BASE$, MID$(HEXA$, HEXCOUNT%, 1)) - 1 NEXT HEXCOUNT%
HEXLENGH% = 0
RETURN
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Conversion décimale hexadécimale. Jeu 29 Juil 2010 - 14:29 | |
| C'est déjà beaucoup plus compact.
Cela dit, je ne sais pas si c'est une bonne idée de donner le même nom à des variables de types différents (je ne savais même pas que c'était possible), parce que ça prête à confusion: Hexa% et Hexa$, Base% et Base$ ... | |
| | | Tecking
Nombre de messages : 114 Age : 36 Localisation : Toulouse Date d'inscription : 30/05/2010
| Sujet: Re: Conversion décimale hexadécimale. Jeu 29 Juil 2010 - 19:59 | |
| au contraire je sait que HEXA est la valeur d'entrée % et $ me permettent de choisir de quelle base je pars et à quelle base j'arrive. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Conversion décimale hexadécimale. Jeu 29 Juil 2010 - 20:05 | |
| | |
| | | Contenu sponsorisé
| Sujet: Re: Conversion décimale hexadécimale. | |
| |
| | | | Conversion décimale hexadécimale. | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |