2013-10-15 4 views
0

Итак, я пытаюсь написать функцию, которая преобразует hexidecimal в десятичный. У меня две проблемы. Я не могу заставить его заменить все буквы числом. Он заменяет письмо и затем останавливается. Во-вторых, как мне получить его так, чтобы он последовательно добавлял каждое целое число?Преобразование hexidecimal в десятичный

def toDecimal(hexidecimal): 
    decimal=[hexidecimal[i:i+1] for i in range(0,len(hexidecimal), 1)] 
    for i in range(0,len(decimal)): 
      if 'a' in decimal: 
       decimal[i]='10' 
      if 'b' in decimal: 
       decimal[i]='11' 
      if 'c' in decimal: 
       decimal[i]='12' 
      if 'd' in decimal: 
       decimal[i]='13' 
      if 'e' in decimal: 
       decimal[i]='14' 
      if 'f' in decimal: 
       decimal[i]='15' 
      return decimal 
     #Above I try to convert any letters into a number value 
    for i in range(0,len(decimal)): 
     converted_decimal=decimal[i]*(16**i) 
     total_decimal=converted_decimal+converted_decimal 
    return total_decimal 
    #Here I'm trying to add each converted decimal 
+0

действительно ли это присваивание ? в противном случае int (hexnumber, 16) выполняет задание – lucasg

+0

Да, это задание. – user2801066

+0

Попробуйте 'int ('0xA', 16)' или 'eval ('0xA')' –

ответ

0

Существует гораздо более простой способ сделать это:

Что-то большое:

>>> s = "6f48f8248e828ce82f82" 
>>> int(s, 16) 
525528725744949635067778L 

что-то меньше:

>>> int('BF', 16) 
191 

Добавление 0x перед номером делает не изменить конечный результат.

В функции:

def hex2dec(s): 
    """return the integer value of a hexadecimal string s""" 
    return int(s, 16) 
0

Я просто иметь немного удовольствия здесь, но переписать функцию ...

def toDecimal(hexadecimal): 
    decimal = int(hexadecimal, 16) 
    return decimal 

toDecimal('0xdeadbeef') 

я предполагаю, что вы повторно изобретая колесо, чтобы посмотреть, как это делается? :)

+0

Это назначение. Мне не разрешено использовать int(). – user2801066

2

В коде есть много проблем. Давайте через него:

hexidecimal= "7ac8965f" #hexadecimal value 

decimal=[hexidecimal[i:i+1] for i in range(0,len(hexidecimal), 1)] 
# >> decimal : ["7","a","c","8","9","6","5","f"] 

for i in range(0,len(decimal)): 
# first path : i = 0 

     # First Error : 'in' is a array-wide search. 
     # you want to use :'if decimal[i] == 'a' ' 
     if 'a' in decimal: # a is in decimal (second pos) so decimal[0] is modified ! 
      decimal[i]='10' 
      # >> decimal : ["10","a","c","8","9","6","5","f"] 

     if 'b' in decimal: 
      decimal[i]='11' 
     if 'c' in decimal: 
      decimal[i]='12' 
     if 'd' in decimal: 
      decimal[i]='13' 
     if 'e' in decimal: 
      decimal[i]='14' 
     if 'f' in decimal: # f is in decimal (last pos) so decimal[0] is modified ! 
      decimal[i]='15' 
      # >> decimal : ["15","a","c","8","9","6","5","f"] 

     #Second Error : anticipated return 
     #Assuming the indentation is correct, the function exit here, on the 
     #first run of the function 
     return decimal 

Теперь решение:

#dict for conversion (there are more elegant ways to do it, 
#              but this is good enough) 
conversion_table = { '0' : 0 , 
        '1' : 1 , 
        '2' : 2 , 
        '3' : 3 , 
         ....... 
        'a' : 10 , 
        'b' : 11 , 
        ...... 
        'f' : 15 
        } 

hexidecimal= "7ac8965f" #hexadecimal value 

hexa_list=[ digit for digit in hexidecimal] 
# same thing as before, just more "elegant" 

decimal = [ conversion_table[hex_digit] for hex_digit in hexa_list] 
# convert everything in base10 

# reduce the list 
return reduce(lambda x,y : x*16 + y, decimal) 
2

Я думаю, что было бы полезно для вас, чтобы прочитать это идиоматический Python Tutorial: http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html

def hex2dec(hexadecimal): 
    conversion_table = {'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15} 

    hex_list = list(hexadecimal) 

    for index, number in enumerate(hex_list): 
     number = number.upper() 

     if number in conversion_table: 
      hex_list[index] = conversion_table[number] 

    int_list = [int(number) for number in hex_list] 

    return reduce(lambda x, y: x*16+y, int_list) 


print hex2dec('7Ac8965f') # 2059966047 
Смежные вопросы