2013-10-15 56 views
0

所以我試圖編寫一個將十六進制轉換爲十進制的函數。 我有兩個問題。我無法用數字替換所有字母。它取代了一封信,然後停下來。其次,我如何獲得它,以便它連續添加每個整數?將十六進制轉換爲十進制

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

是它的一個assignement ?否則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

我認爲這將是對你有所幫助,閱讀本慣用的蟒蛇教程: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 
相關問題