如何在 Python 中使用不带0x 的 hex() ?

Python 中的 hex()函数将前导字符 0x放在数字的前面。有没有办法告诉它不要把他们?所以 0xfa230就是 fa230

密码是

import fileinput
f = open('hexa', 'w')
for line in fileinput.input(['pattern0.txt']):
f.write(hex(int(line)))
f.write('\n')
211094 次浏览

(建议)

Python 3 f-string : 回答者: < a href = “ https://stackoverflow. com/a/52674814/1219006”>@GringoSuave

>>> i = 3735928559
>>> f'{i:x}'
'deadbeef'

备选方案:

format内建函数 (只适用于单个值)

>>> format(3735928559, 'x')
'deadbeef'

有时我们仍然需要使用 str.format格式在某些情况下 @ Eumiro

(尽管在大多数情况下我仍然推荐 f-strings)

>>> '{:x}'.format(3735928559)
'deadbeef'

(遗产) f-strings应该解决您的所有需求,但 printf样式的格式设置是我们过去所做的 @ msvalkon

>>> '%x' % 3735928559
'deadbeef'

没有字符串格式化 @ jsbueno

>>> i = 3735928559
>>> i.to_bytes(4, "big").hex()
'deadbeef'

拙劣的回答(避免)

hex(i)[2:] @ GuillaumeLema ître

>>> i = 3735928559
>>> hex(i)[2:]
'deadbeef'

这依赖于字符串切片,而不是使用专门用于格式化为 hex的函数/方法。这就是为什么负数可能会产生意想不到的结果:

>>> i = -3735928559
>>> hex(i)[2:]
'xdeadbeef'
>>> f'{i:x}'
'-deadbeef'

使用以下代码:

'{:x}'.format(int(line))

它还允许你指定一些数字:

'{:06x}'.format(123)
# '00007b'

对于 Python 2.6的使用

'{0:x}'.format(int(line))

或者

'{0:06x}'.format(int(line))

旧式字符串格式:

In [3]: "%x" % 127
Out[3]: '7f'

新风格

In [7]: '{:x}'.format(127)
Out[7]: '7f'

使用大写字母作为格式字符生成大写十六进制

In [8]: '{:X}'.format(127)
Out[8]: '7F'

文件在这里。

你可以随便写

hex(x)[2:]

去掉前两个字符。

Python 3.6 + :

>>> i = 240
>>> f'{i:x}'  # 02x to pad with zeros
'f0'

虽然以前的所有答案都可以使用,但是很多答案都有一些警告,比如不能同时处理正数和负数,或者只能在 Python2或3中使用。下面的版本同时适用于 Python2和3,以及正数和负数:

因为 Python 从 hex ()返回一个字符串十六进制值,所以我们可以使用 string.place 删除0x 字符,而不管它们在字符串中的位置(这一点很重要,因为正数和负数的位置是不同的)。

hexValue = hexValue.replace('0x','')

编辑: wjandrea 提出了一个很好的观点,即上面的实现不处理包含0X 而不是0x 的值,这些值可以出现在 int 文本中。记住这个用例,您可以使用以下不区分大小写的 Python 2和3实现:

import re
hexValue = re.sub('0x', '', hexValue, flags=re.IGNORECASE)

输出以16为基数的数字,用 小写字母字母表示9以上的数字。

>>> format(3735928559, 'x')
'deadbeef'

输出以16为基数的数字,用 大写字母表示9以上的数字。

>>> format(3735928559, 'X')
'DEADBEEF'

您可以在 Python 的文档中找到更多相关信息:

十进制到十六进制, 成功了

hex(number).lstrip("0x").rstrip("L")

F 弦

Python 3的 格式化的文字字符串(f-string)支持 格式规格小型语言,它将十六进制数字指定为 x

所以你可以这样做:

>>> f"{3735928559:x}"
'deadbeef'

查看其他碱基的规范,如二进制,八进制等。

编辑: str.removeprefix

自 Python 3.9以来,现在有了一个 str.removeprefix方法,它允许您编写以下更明显的代码:

>>> hexadecimal = hex(3735928559)
>>> hexadecimal.removeprefix('0x')
'deadbeef'

并不是说这对负数不起作用。 something:

>>> negadecimal = hex(-3735928559)
>>> negadecimal.removeprefix('0x')
'-0xdeadbeef'

除了字符串格式化之外,有趣的是,在处理数字及其十六进制表示时,我们通常处理的是字节内容,并对字节之间的关系感兴趣。

Python 3中的 bytes类已经被3.x 系列的方法所丰富,而 int.to_bytesbytes.hex()的结合提供了对十六进制数字输出的完全控制,同时保留了转换的语义(更不用说,保留中间的“字节”对象,以便在任何需要这个数字的二进制协议中使用) :

In [8]: i = 3735928559


In [9]: i.to_bytes(4, "big").hex()
Out[9]: 'deadbeef'

除此之外,bytes.hex()允许对输出进行一些控制,例如为十六进制数字指定分隔符:

In [10]: bytes.hex?
Docstring:
Create a string of hexadecimal numbers from a bytes object.


sep
An optional single character or byte to separate hex bytes.
bytes_per_sep
How many bytes between separators.  Positive values count from the
right, negative values count from the left.


Example:
>>> value = b'\xb9\x01\xef'
>>> value.hex()
'b901ef'
>>> value.hex(':')
'b9:01:ef'
>>> value.hex(':', 2)
'b9:01ef'
>>> value.hex(':', -2)
'b901:ef'

(也就是说,在大多数情况下,只需要一个快速打印,我可能只是通过 f 字符串格式化,在公认的答案: f"{mynumber:04x}"-为了“更少的事情要记住”的简单原因)