2013-10-15 22 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 
相关问题