web-dev-qa-db-fra.com

Python convertir décimal en hexadécimal

J'ai une fonction ici qui convertit le nombre décimal en hexadécimal, mais elle l'affiche dans l'ordre inverse. Comment pourrais-je résoudre ce problème?

def ChangeHex(n):
    if (n < 0):
        print(0)
    Elif (n<=1):
        print(n)
    else:
        x =(n%16)
        if (x < 10):
            print(x), 
        if (x == 10):
            print("A"),
        if (x == 11):
            print("B"),
        if (x == 12):
            print("C"),
        if (x == 13):
            print("D"),
        if (x == 14):
            print("E"),
        if (x == 15):
            print ("F"),
        ChangeHex( n / 16 )
38
Eric

Si vous souhaitez le coder vous-même au lieu d'utiliser la fonction intégrée hex(), vous pouvez simplement effectuer l'appel récursif avant d'imprimer le chiffre actuel:

def ChangeHex(n):
    if (n < 0):
        print(0)
    Elif (n<=1):
        print n,
    else:
        ChangeHex( n / 16 )
        x =(n%16)
        if (x < 10):
            print(x), 
        if (x == 10):
            print("A"),
        if (x == 11):
            print("B"),
        if (x == 12):
            print("C"),
        if (x == 13):
            print("D"),
        if (x == 14):
            print("E"),
        if (x == 15):
            print ("F"),
21
Sven Marnach

Et ça:

hex(dec).split('x')[-1]

Exemple:

>>> d = 30
>>> hex(d).split('x')[-1]
'1e'

~ Rich

En utilisant -1 dans le résultat de split (), cela fonctionnerait même si split renvoyait une liste d'un élément. 

84
Rich

Ce n'est pas exactement ce que vous avez demandé, mais vous pouvez utiliser la fonction "hex" en python:

>>> hex(15)
'0xf'
32
Joseph Lisee

Je pense que cette solution est élégante:

def toHex(dec):
    x = (dec % 16)
    digits = "0123456789ABCDEF"
    rest = dec / 16
    if (rest == 0):
        return digits[x]
    return toHex(rest) + digits[x]

numbers = [0, 11, 16, 32, 33, 41, 45, 678, 574893]
print [toHex(x) for x in numbers]
print [hex(x) for x in numbers]

Cette sortie:

['0', 'B', '10', '20', '21', '29', '2D', '2A6', '8C5AD']
['0x0', '0xb', '0x10', '0x20', '0x21', '0x29', '0x2d', '0x2a6', '0x8c5ad']
20
Lynch

J'utilise 

"0x%X" % n

n est le nombre décimal à convertir.

16
thanos

Si sans le préfixe '0x':

'{0:x}'.format(int(dec))

sinon utilisez la fonction hex() intégrée.

13
nikioa

La méthode de format de chaîne de Python peut prendre une spécification de format.

De décimal à binaire

"{0:b}".format(154)
'10011010'

De décimal à octal

"{0:o}".format(154)
'232'

De décimal à hexadécimal

"{0:x}".format(154)
'9a'

Formater les documents de spécifications pour Python 2

Docs de spécification de format pour Python 3

8
cjahangir
def main():
    result = int(input("Enter a whole, positive, number to be converted to hexadecimal: "))
    hexadecimal = ""
    while result != 0:
        remainder = changeDigit(result % 16)
        hexadecimal = str(remainder) + hexadecimal
        result = int(result / 16)
    print(hexadecimal)

def changeDigit(digit):
    decimal =     [10 , 11 , 12 , 13 , 14 , 15 ]
    hexadecimal = ["A", "B", "C", "D", "E", "F"]
    for counter in range(7):
        if digit == decimal[counter - 1]:
            digit = hexadecimal[counter - 1]
    return digit

main()

C'est le plus dense que j'ai pu faire pour convertir décimal en hexadécimal. NOTE: Ceci est dans la version 3.5.1 de Python

1
John

En plus d'utiliser la fonction hex () intégrée, cela fonctionne bien:

letters = [0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F']
decimal_number = int(input("Enter a number to convert to hex: "))
print(str(letters[decimal_number//16])+str(letters[decimal_number%16]))

Cependant, cela ne fonctionne que pour convertir des nombres décimaux allant jusqu'à 255 (pour donner un nombre hexadécimal à deux chiffres).

0
John Skeen

C'est la meilleure façon de l'utiliser

hex(53350632996854).lstrip("0x").rstrip("L")
# lstrip helps remove "0x" from the left  
# rstrip helps remove "L" from the right 
# L represents a long number

Exemple:

>>> decimal = 53350632996854
>>> hexadecimal = hex(decimal).lstrip("0x")
>>> print(hexadecimal)
3085a9873ff6

si vous en avez besoin majuscule, vous pouvez utiliser "fonction supérieure" Par exemple:

decimal = 53350632996854
hexadecimal = hex(decimal).lstrip("0x").upper()
print(hexadecimal)
3085A9873FF6
0
Mohammed Towfiq
n = eval(input("Enter the number:"))
def ChangeHex(n):
    if (n < 0):
        print(0)
    Elif (n<=1):
        print(n),
    else:
        ChangeHex( n / 16 )
        x =(n%16)
        if (x < 10):
            print(x), 
        if (x == 10):
            print("A"),
        if (x == 11):
            print("B"),
        if (x == 12):
            print("C"),
        if (x == 13):
            print("D"),
        if (x == 14):
            print("E"),
        if (x == 15):
            print ("F"),
0
Ermias Asmare

Pour obtenir une valeur hexadécimale pure, cela pourrait être utile. C'est basé sur la réponse de Joe:

def gethex(decimal):
    return hex(decimal)[2:]

Au lieu de tout imprimer dans la fonction, vous pouvez simplement lui permettre de renvoyer la valeur en hexadécimal et de faire ce que vous voulez.

def ChangeHex(n):
    x = (n % 16)
    c = ""
    if (x < 10):
        c = x
    if (x == 10):
        c = "A"
    if (x == 11):
        c = "B"
    if (x == 12):
        c = "C"
    if (x == 13):
        c = "D"
    if (x == 14):
        c = "E"
    if (x == 15):
        c = "F"

    if (n - x != 0):
        return ChangeHex(n / 16) + str(c)
    else:
        return str(c)

print(ChangeHex(52))

Il existe probablement des manières plus élégantes d’analyser les composants alphabétiques de l’hex, au lieu d’utiliser des conditionnelles.

0
voithos
hex_map = {0:0, 1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8, 9:9, 10:'A', 11:'B', 12:'C', 13:'D', 14:'E', 15:'F'}

def to_hex(n):
    result = ""
    if n == 0:
        return '0'
    while n != 0:
        result += str(hex_map[(n % 16)])
        n = n // 16
    return '0x'+result[::-1]
0
Shiv Konar

Une version utilisant l'itération:

def toHex(decimal):
    hex_str = ''
    digits = "0123456789ABCDEF"
    if decimal == 0:
       return '0'

    while decimal != 0:
        hex_str += digits[decimal % 16]
        decimal = decimal // 16

    return hex_str[::-1] # reverse the string

numbers = [0, 16, 20, 45, 255, 456, 789, 1024]
print([toHex(x) for x in numbers])
print([hex(x) for x in numbers])
0
Youngsup Kim