我是python的新手,我正在通过Donour Sizemore为ELM327进行一个名为pyOBD的开源项目(不太确定,可能针对更多的scantool设备)。我可以看出以下是一种转换方法一个十六进制值到int.But它是如何工作的?特别是其中包含eval
的行。
def hex_to_int(str):
i = eval("0x" + str, {}, {})
return i
答案 0 :(得分:4)
eval
运行一个字符串,就像它是Python代码一样,然后输出结果。
在这种情况下,它运行类似0xaf
的东西,这是一种指定十六进制文字的方法,并输出结果整数。尝试在Python解释器中键入0xaf
,结果会得到一个整数。
eval
在不受信任的输入上使用是不安全的。例如,
eval("0xa and __import__('os').remove('some/file/path')")
可以删除系统上的文件。
最好使用ast.literal_eval
或int
:
>>> import ast
>>> ast.literal_eval("0xaf")
175
>>> int("af", 16)
175
哪些是安全的并产生相同的结果。