Page 1 sur 1

[R] Convertion d'un nombre 64 bit en hexadecimal

Posté : dim. 17 oct. 2010 11:02
par kalixe
Bonjour,

la fonction hex() permet de convertir uniquement les nombres de 32 bit, avez vous une méthode pour convertir un nombre de 64 bits en hexa ?

Par avance, merci

Re: [..] Convertion d'un nombre 64 bit en hexadecimal

Posté : dim. 17 oct. 2010 11:05
par Tlem

Re: [..] Convertion d'un nombre 64 bit en hexadecimal

Posté : dim. 17 oct. 2010 13:03
par kalixe
Heu non tlem :s

je ne souhaite pas faire de l'encodae en base64, je souhaite convertir un nombre entier décimal en hexadecimal, comme lorsque tu prends ta calculatrice en affichage programmeur et tu peux convertir d'un clique n'importe quel nombre, vu que la focntion Hex() ne peut remplir se rôle il doit y avoir une autre méthode ?

Re: [..] Convertion d'un nombre 64 bit en hexadecimal

Posté : dim. 17 oct. 2010 13:59
par ragnoff
Bonjour

Si j ai bien suivi, tu as un grand nombre décimal a transformer en hexa ...

je te donne ceci, petit code perso, qui date un peu, a regarder avant d'éxécuter donc ..

Code : Tout sélectionner

[spoiler=]
#Include <string.au3>


func Base16($n)
    Switch $n
        Case 0 to 9
            $retour = String($n)
        Case 10
            $retour = "a"
        Case 11
            $retour = "b"
        Case 12
            $retour = "c"
        Case 13
            $retour = "d"
        Case 14
            $retour = "e"
        Case 15
            $retour = "f"
    EndSwitch
    Return $retour
EndFunc

Func Longeur($n)
    Return 1 + Floor(log($n)/log(16))
EndFunc

Func Decto16($m)
    $n = $m
    $Longueur = Longeur($n)
    $16 = ""

    $Longueur = $Longueur - 1
    $p = floor($m / ( 16 ^ $Longueur ))
    $pstring = Base16($p)
    $16 = $pstring
    $m = $m - ( $p * (16 ^ $Longueur))
    $i = 0
    while $Longueur > 0
        $Longueur = $Longueur - 1
        $i = $i + 1
        $p = floor($m / ( 16 ^ $Longueur ))
        $pstring = Base16($p)
        $16 = _StringInsert($16,$pstring,$i)
        $m = $m - ( $p * (16 ^ $Longueur))

    WEnd
    Return $16
EndFunc
[/spoiler]
 
c'est surement pas le code le plus performant pour un changement de base, notamment du au sens d'écriture en base 16 ( droite a gauche, ou gauche a droite ), mais ça devrait faire l affaire ...

Re: [..] Convertion d'un nombre 64 bit en hexadecimal

Posté : dim. 17 oct. 2010 16:28
par kalixe
Merci mais ca ne donne pas le bon résultat et lorsque c'est un entier négatif il ne sait pas le traiter, il me renvoi rien :(

Re: [..] Convertion d'un nombre 64 bit en hexadecimal

Posté : dim. 17 oct. 2010 17:15
par ragnoff
Il ne donne pas le bon résultat ... Exact, si tu passes les limites de stockage de autoit en matière de nombre entier. Dans ce cas la, faut que tu changes de manière de stocker les nombres. Un exemple de ce que tu met en entré sera surement un plus pour t'aider ... Quand aux nombres négatifs, effectivement, il ne sait pas les traiter ... a toi d'adapter ;)

Re: [R] Convertion d'un nombre 64 bit en hexadecimal

Posté : dim. 17 oct. 2010 18:05
par kalixe
C'est bon j'ai fini par trouver (avec bcp de temps) :

Convertion de du decimal à l'hexa et de l'hexa au decimal

Code : Tout sélectionner

Global $tHEX_64 = DllStructCreate('int64')
Global $tHEX_32 = DllStructCreate('int;int', DllStructGetPtr($tHEX_64))
Global $tHEX_00 = DllStructCreate('byte[8]', DllStructGetPtr($tHEX_64))

Func Dec2Hex($nVal) ;; ! output: Full 8 Byte Hex-string without leading '0x'.
    If Not IsNumber($nVal) Then Return SetError(1, 0, '')
    ;; If IsFloat($nVal) Then Return '80000000' ;; == Hex() behavior.
    ;; If IsFloat($nVal) Then $nVal = Floor($nVal) ;; == Current default behavior.
    ;
    DllStructSetData($tHEX_64, 1, $nVal)
    Return Hex(DllStructGetData($tHEX_32, 2)) & Hex(DllStructGetData($tHEX_32, 1))
EndFunc

Func Hex2Dec($sHex) ;; ! Input: Full 8 Byte Hex-string without leading '0x'.
    If Not IsString($sHex) Then Return SetError(1, 0, '')
    If StringLen($sHex) <> 16 Then Return SetError(2, 0, '')
    If StringRegExp($sHex, '(?i)[^\dABCDEF]') Then Return SetError(3, 0, '')
    ;
    DllStructSetData($tHEX_00, 1, Binary('0x' & $sHex))
    $sHex = Hex(DllStructGetData($tHEX_32, 2)) & Hex(DllStructGetData($tHEX_32, 1))
    DllStructSetData($tHEX_00, 1, Binary('0x' & $sHex))
    Return DllStructGetData($tHEX_64, 1)
EndFunc