如何在Python中将十六进制转换为十进制?

180

我有一些Perl代码,其中hex()函数将十六进制数据转换为十进制。在Python上如何实现?

我在Perl中有hex()函数,它可以将十六进制数据转换为十进制数。那么在Python中如何实现呢?

1
您确定要将数据转换为“十进制”吗?Perl函数仅将十六进制字符串转换为整数,而不是十进制字符串。 - Sven Marnach
@SvenMarnach 我使用这个 Perl hex() 手册 http://www.misc-perl-info.com/perl-hex.html "这个函数: 接受一个十六进制字符串(或者一个在求值后返回十六进制字符串的表达式) 将返回对应的十进制值" - Sir D
2
@ Sir D:那篇文章措辞非常糟糕。正如Sven所说,hex将十六进制字符串转换为整数值(该值在内部以二进制形式存储,但本质上只是一个没有基数的数值)。对print的调用将该值转换为十进制字符串并打印出来。 - Borodin
扩展问题“如何像Python解释器一样将十六进制或十进制(或二进制)转换为整数”在“已经有答案的问题”中得到了回答。 int(string,base)函数从字符串前缀推断输入字符串的基数。如果您将0作为基数传递。例如 int(“0x1402”,0)int(“0b1010000000010”,0)int(“5122”,0)https://dev59.com/InVC5IYBdhLWcg3wsTfv - gaoithe
3个回答

335
如果您所说的“十六进制数据”是指形如 "hex data" 的字符串,
s = "6a48f82d8e828ce82b82"

你可以使用

i = int(s, 16)

将其转换为整数并

str(i)

将其转换为十进制字符串。


1
对于一个负的十六进制数,这个方法不起作用。 - Eric
2
@EricWang 这对负数完美适用:http://ideone.com/IHOQvp。除非你有一个以固定宽度的二进制补码格式编码的负数,但那将是一个与此问题不同的问题。(提示:在这种情况下使用`struct`模块。) - Sven Marnach
2
十六进制 -> 十进制 -> 二进制 -> 十进制: int(bin(int(hex(42), 16)), 2) - arcolife
3
请注意这是一个 大端序 的解释。这种方法适用于某些情况(例如许多网络协议采用大端序),但对于其他情况则不然,比如查看当前大多数系统中本地的内部程序数据,这些系统通常采用小端序。 - Chris Stratton
1
相反,实际上遇到已经呈现为人类可读的十六进制格式,其中包含小端数值的数据是非常普遍的。因此,这个评论一点也不误导。Python不仅被用于全面的纯Python解决方案,而且在处理其他系统的输出和日志以及组装测试设备时也被广泛使用。 - Chris Stratton
显示剩余3条评论

56
>>> int("0xff", 16)
255
或者
>>> int("FFFF", 16)
65535

阅读文档


4
int(0xff)会执行正确的操作。只有在将其作为字符串传递时,才需要显式指定基数。 - cassm
1
@cassm 实际上,在这种情况下使用 int() 没有意义 - 这就像写 int(255) 一样 - 你可以直接写 0xff - jbg

21
您可以使用文字解析(literal eval):
>>> ast.literal_eval('0xdeadbeef')
3735928559

或者将基数作为参数指定给int函数:

>>> int('deadbeef', 16)
3735928559

一个不太为人知的技巧,如果你在int中指定基数为0,那么Python将尝试从字符串前缀确定基数:

>>> int("0xff", 0)
255
>>> int("0o644", 0)
420
>>> int("0b100", 0)
4
>>> int("100", 0)
100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接