Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

conversion hexa int

6 réponses
Avatar
JBB
voila j'ai une chaine du genre
s = " a = 0x010 b = 0x789 "
que je veux transforme en
" a = 16 b = 1929 "

bref remplacer tous les nombres en hexa par leur valeurs en decimal.

Je suis sur qu'on peut faire ça en une ligne avec des expression
regulieres mais j'ai un peu de mal.

Le premier qui trouve gagnera toute ma reconnaissance.
(C'est pas cher payé je sais mais bon c'est mieux que rien).

Merci à tous.

en fait je vous fait un peu bosser à ma place ...
;)

6 réponses

Avatar
Sébastien Kirche
Le 21 July 2005 à 18:07, JBB a dit :

bref remplacer tous les nombres en hexa par leur valeurs en decimal.

Je suis sur qu'on peut faire ça en une ligne avec des expression
regulieres mais j'ai un peu de mal.


Même pas besoin :

int("0x789", 16)
-> 1929

--
Sébastien Kirche

Avatar
JBB
Le 21 July 2005 à 18:07, JBB a dit :


bref remplacer tous les nombres en hexa par leur valeurs en decimal.

Je suis sur qu'on peut faire ça en une ligne avec des expression
regulieres mais j'ai un peu de mal.



Même pas besoin :

int("0x789", 16)
-> 1929

Je peux faire aussi

str(eval("0x45"))

mais je veux pour voir faire cette conversion sur toutes les occurences
dans la chaine.
" 0x010" -> "16"
" 0x01 et 0x10 font 0x11" -> " 1 et 16 font 17"


Avatar
Marvin
Même pas besoin :

int("0x789", 16)
-> 1929

Erf, moi qui avait pondu un super programme trop gros et mal codé... bon

je vous le passe quand meme pour que vous voyez comme je suis nul...

t = {}
s = " a = 0x010 b = 0x789 "
for a in s.split('=')[1:]:
c = 0
i = a.split(" ")[1].split("x")[1].rfind(a.split(" ")[1].split("x")[1][-1])
for b in a.split(" ")[1].split("x")[1]:
c += int(b)*16**i
i = i-1
t[a.split(" ")[1]] = c
for key in t.keys():
s=s.replace(key,str(t[key]))
print s

voila, c'est moche, sa prend de la place, c'est pas optimisé, mais sa
marche (en tout cas pour cette valeur)
--

Antoine Brunet
Tiaps Is A Python Server http://www.tiaps.org

Avatar
Loic Berthe
JBB wrote:

int("0x789", 16)
-> 1929

Je peux faire aussi

str(eval("0x45"))

mais je veux pour voir faire cette conversion sur toutes les occurences
dans la chaine.
" 0x010" -> "16"
" 0x01 et 0x10 font 0x11" -> " 1 et 16 font 17"


Un exemple avec des expressions rationnelles :
from re import compile
hexa = compile('d+xd+')
remplace = lambda m : str(int(m.group(),16))

s = " 0x01 et 0x10 font 0x11"
hexa.sub(remplace,s)
' 1 et 16 font 17'




Pour bien comprendre comment marchent ces expressions, je te conseille le
lien suivant :

http://www.amk.ca/python/howto/regex/

Ce qui est amusant c'est qu'il donne exactement l'exemple inverse, comment
convertir un nombre décimal en héxadécimal !

--
Loic



Avatar
Marvin
Un exemple avec des expressions rationnelles :

from re import compile
hexa = compile('d+xd+')
remplace = lambda m : str(int(m.group(),16))

s = " 0x01 et 0x10 font 0x11"
hexa.sub(remplace,s)




' 1 et 16 font 17'


Cet exemple fonctionne pour toute valeur hexadécimale composée
uniquement de chiffres (sans les lettres).
L'adaptation qui permet d'avoir n'importe quel nombre hexadecimal de la
forme 0xNN est de simplement modifier la ligne:
hexa = compile('d+xd+')
en la remplaçant par:


hexa = compile('d+x[a-fd]+')



Voila...
--

Antoine Brunet
Tiaps Is A Python Server http://www.tiaps.org




Avatar
tiissa
Marvin wrote:
L'adaptation qui permet d'avoir n'importe quel nombre hexadecimal de la
forme 0xNN est de simplement modifier la ligne:
hexa = compile('d+xd+')
en la remplaçant par:


hexa = compile('d+x[a-fd]+')




'11x1' sera accepté mais pas '0XA'.
Si on veut être encore plus précis, un nombre hexa satisfait (en python
mais aussi dans d'autres langages) :
'0[xX][da-fA-F]+'