Problème: Hexa en Dec, sur grand nombre

Bonjour à tous,

J'ai un soucis pour convertir un nombre Hexadécimal en Décimal.

Le problème n'est pas de faire la conversion, cela ça fonctionne.

Mon problème est la taille de l'Hexa, il fait 40 caractères de long, et le décimal devrait en faire 48.

hexa: 4600d4a11211e26fb5ab1d15c3e0b17dd8493908

decimal théorique : 399647876571766339785545465901617466292944058632

décimal retourner par vb: 3,99647876571766E+47

ou, si je demande tous les chiffres: 399647876571766000000000000000000000000000000000

d'ou ma question, comment faire pour que le code vb retourne le même nombre que celui théorique, sans arondir la valeur,

car le nombre decimal et un numéro de série, j'ai donc besoin de tous les chiffres soient exact,..

merci de m'avoir lu,

FORMAT DE CELLUE => de standart a nombre mais sur la feuille exel

ou

FORMAT DE CELLUE => de standart a text mais sur la feuille exel

bonjour Amir,

voici ce que cela donne:

si cellule sur nombre: 399647876571766000000000000000000000000000000000

si cellule sur texte: 3,99647876571766E+47

la variable contenant le nombre en Hexa est de type Double

je n'arrive pas a avoir la valeur "réelle' du nombre décimal, Excel me retourne toujours la valeur arrondie,...

SALUT

SVP envoyer unextrait de ton fichier comme exemple

Bonjour,

le stockage des réels sur excel ne conserve que que 15 chiffres significatifs.

Tu ne peux donc pas faire cela avec les fonctions standards. Il faut découper le travail et construire le résultat dans une chaine.

Ici des fonctions personnalisées pour travailler sur les grands nombres : http://fordom.free.fr/

Ou fait une recherche google, ça serait étonnant que personne n'ai eut besoin de ça auparavant.

Mais as-tu vraiment besoin de le convertir en décimal ? Qu'est-ce que ça t'apporte puisque c'est un n° de série ? Tu ne dois pas avoir de calculs à faire dessus je suppose.

eric

bonjour,

@Eric:

J'ai besoin des versions Hexadécimale et Décimale du n° de série, c'est un certificat SSL,

dans celui-ci le n° est stocké en Hexa, et le programme qui l'utilise, a besoin de la version décimale.

Et pour autoriser son utilisation, j'ai besoin d'encoder manuellement le SSL version décimale,...

voilà mon soucis, jusqu’à présent le n° de série étais sous 8 digits hexa, maintenant il sont passé a 40 digits,...

Merci pour la piste, je vais aller regarder de ce côté.

@Amir:

Sub Hexa2Dec()

Dim hexa, dec, t0 As String
Dim i, j, k As Single
Dim tDec, t1 As Double

decArray = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15")    ' Decimal values
hexArray = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")    ' Hexadecimal values
dec = ""
hexa = UCase(Replace(Trim(Range("B5").Value), " ", ""))     ' B5 = Cell with hexa string

For i = Len(hexa) To 1 Step -1
    t0 = Mid(hexa, i, 1)
    For j = 0 To UBound(hexArray)
        If hexArray(j) = t0 Then
            dec = decArray(j) & " " & dec
            Exit For
        End If
    Next j
Next i

decTmp = Split(Trim(dec), " ")
For i = UBound(decTmp) To 0 Step -1
    j = UBound(decTmp) - i
    k = Val(decTmp(i))
    t1 = k * (16 ^ j)
    tDec = tDec + t1
Next i
Range("B9").Value = tDec     ' B9 = cell with decimal string

End Sub

Galium.

Bonjour,

une proposition de solution

Sub test()
    h$ = InputBox("entrez une valeur Hexa")
    a = cvthextodec(h)
    sav = Cells(1, 1).Formula
    Cells(1, 1).Copy
    Cells.Formula = sav
    MsgBox a & vbCrLf & "copié dans le clipboard"
End Sub
Function cvthextodec(n As String) As String
    n = UCase(n)
    h = "0"
    For i = 1 To Len(n)
        a = (InStr("0123456789ABCDEF", Mid(n, i, 1)) - 1) & ""
        If h <> "0" Then
            For j = 1 To 4
                h = plusstr(h, h)
            Next j
        End If
        h = plusstr(h, a)
        Next i
        cvthextodec = h
    End Function
Function plusstr(s1, s2)
    r = ""
    rep = 0
    ls1 = Len(s1)
    ls2 = Len(s2)
    If ls1 < ls2 Then s1 = Right(String(ls2, "0") & s1, ls2)
    If ls1 > ls2 Then s2 = Right(String(ls1, "0") & s2, ls1)
    For i = Len(s1) To 1 Step -1
        a = Val(Mid(s1, i, 1))
        b = Val(Mid(s2, i, 1))
        c = a + b + rep
        If c > 9 Then rep = 1 Else rep = 0
        r = Right(c, 1) & r
    Next i
    plusstr = IIf(rep = 1, "1", "") & r
End Function

Bonjour,

une proposition de solution

Sub conversionhexatodecimal()
    h$ = InputBox("entrez une valeur Hexa")
    a = cvthextodec(h) ' appel de la fonction de conversion
    sav = Cells(1, 1000) ' on sauve le contenu de la cellule qui va permettre la copie dans le clipboard
     cells(1,1000)=a ' on met la valeur  convertie en cellule 1,1000
    Cells(1, 1000).Copy ' on la copie dans le clipboard
    Cells(1,1000) = sav ' on restitue l'ancienne valeur dans la cellule 1,1000
    MsgBox a & vbCrLf & "copié dans le clipboard"
End Sub

Function cvthextodec(n As String) As String
' fonction de conversion d'une longue chaine hexadécimale  (n) en décimal
    n = UCase(n) ' on convertit le nombre en majuscule
    h = "0" ' valeur initiale de la chaine convertie est 0
    For i = 1 To Len(n) ' on prend tous les caractères de n un par un 
        a = (InStr("0123456789ABCDEF", Mid(n, i, 1)) - 1) & "" :' a contient la valeur décimale du caractère trouvé
        If h <> "0" Then ' si la valeur déjà convertie est différente de 0, il faut multiplier cette valeur par 16 avant d'ajouter la valeur correspondant au caractère en cours
            For j = 1 To 4 ' boucle de multiplication par 16 (1+1=2, 2+2=4, 4+4=8 et 8+8=16), ceci explique le 1 to 4
                h = plusstr(h, h) ' on appelle la fonction d'addition de chaines de chiffres, (équivalent à h=h+h)
            Next j
        End If
        h = plusstr(h, a) 'on appelle la fonction d'addition de chaines de chiffres, (équivalent à h=h+a) on ajoute la valeur du caractère en cours à la valeur précédente multipliée par 16.
        Next i
        cvthextodec = h ' résultat de la fonction
    End Function

Function plusstr(s1, s2)
' fonction d'addtion de chaines numériques, addition de chiffres de chaque chaines 1 par 1
    r = ""
    rep = 0 'rep = report
    ls1 = Len(s1)
    ls2 = Len(s2)
    If ls1 < ls2 Then s1 = Right(String(ls2, "0") & s1, ls2) ' on vérifie que les 2 chaines ont la même longueur
    If ls1 > ls2 Then s2 = Right(String(ls1, "0") & s2, ls1)
    For i = Len(s1) To 1 Step -1 'on par du dernier chiffre des nombres vers le premier pour faire l'addition
        a = Val(Mid(s1, i, 1))
        b = Val(Mid(s2, i, 1))
        c = a + b + rep
        If c > 9 Then rep = 1 Else rep = 0
        r = Right(c, 1) & r
    Next i
    plusstr = IIf(rep = 1, "1", "") & r ' résultat de l'addition
End Function

edit: ajout commentaires

Salut h2so4,

cool, ça marche,

Il ne me reste plus qu'a l'adapter a ma sheet.

Et surtout décortiquer ton code pour comprendre comment tu as fait.

En tout cas un grand merci à toi et au autres qui ont pris la peine de répondre.

au plaisir, Galium

bonjour,

commentaires ajoutés dans le code voir plus haut.

bonjour,

je n'en demandais pas tant,

encore une fois un super merci;

au plaisir, Galium

Rechercher des sujets similaires à "probleme hexa dec grand nombre"