2015-06-19 47 views
2

因此,我一直在撞墙的过程中撞上了太久,看起来应该是一次简单的数据转换。我正在写python并传递给另一个模块一个十六进制值,该值用一个包装器转换为c类型uint_64t。问题是我通过python库argparse得到这个十六进制值。例如,当它接受这个值时,使用值0x3f,将其保存为一个字符串。如果我尝试施放此为int它抛出的错误:将Python字符串转换为十六进制

"ValueError: invalid literal for int() with base 10: '0x3f'" 

但是如果我创建了一个变量十六进制= 0x3F的,当我把它打印出来,它给了我相应的整数值。 (这是伟大的,因为我创建一个uint)我只是混淆了如何进行转换从字符串到int如果一个强制转换不起作用。我已经看到很多关于将字符串转换为十六进制值的例子(换句话说,将ASCII字符串'0x3f'的每个单独字符并给它一个十六进制值),但是我一直没能找到一个例子我正在寻找的情况。道歉,如果我提出了一次又一次的回答。

回答

5

尝试指定的int是在基地16:

>>> int("0x3f", 16) 
63 

你也可以使用ast.literal_eval,这应该是能够读取,可以用来作为文字的整数任何字符串。只要前缀0x存在,您甚至不必为其指定基准。

>>> import ast 
>>> #hexadecimal 
>>> ast.literal_eval("0x3f") 
63 
>>> #binary 
>>> ast.literal_eval("0b01010") 
10 
>>> #octal 
>>> ast.literal_eval("0712") 
458 
>>> #decimal 
>>> ast.literal_eval("42") 
42 
+0

这谁干的,我想我需要磨练我的Python技能! (虽然我的谷歌搜索技能可能会有更好的改进!) – kennedyl

2

int带有一个可选的第二个参数,这是使用用于转换的数值基础。默认值是10(十进制转换),但你可以将其更改为16(十六进制为)或0(基于前缀自动转换):

>>> int('0b1010', 0) 
10 
>>> int('0x3f', 0) 
63 
>>> int('0o777', 0) 
511 
>>> int('1234', 0) 
1234 
相关问题