如何将一个整型转换为十六进制字符串?

我想取一个整数(将是<= 255),以十六进制字符串表示

例:我想传入65并得到'\x41',或者255并得到'\xff'

我尝试过用struct.pack('c',65)这样做,但在9以上的任何地方都会阻塞,因为它想要接受单个字符串。

775138 次浏览

你正在寻找chr函数。

您似乎混合了整数的十进制表示和整数的十六进制表示,因此不完全清楚您需要什么。根据你的描述,我认为其中一个片段可以说明你想要什么。

>>> chr(0x65) == '\x65'
True




>>> hex(65)
'0x41'
>>> chr(65) == '\x41'
True

注意,这与包含十六进制整数的字符串完全不同。如果这是你想要的,使用内置的hex

试一试:

"0x%x" % 255 # => 0xff

"0x%X" % 255 # => 0xFF

Python文档说:“keep this under Your pillow: http://docs.python.org/library/index.html

hex()呢?

hex(255)  # 0xff

如果你真的想在前面有\,你可以这样做:

print '\\' + hex(255)[1:]

这将把一个整数转换成带有0x前缀的2位十六进制字符串:

strHex = "0x%0.2X" % integerVariable

如果你想打包一个值为<255(一个字节无符号,uint8_t)的结构体,并以一个字符的字符串结束,你可能正在寻找用B代替c。C将字符转换为字符串(本身没有太大用处),而B转换为整数。

struct.pack('B', 65)

(是的,65是\x41,而不是\x65。)

结构类还可以方便地处理通信或其他用途的字节顺序。

我想要一个随机整数转换成一个六位数十六进制字符串与#在开始。为了得到这个,我用了

"#%6x" % random.randint(0xFFFFFF)

注意,对于大值,hex()仍然有效(其他一些答案无效):

x = hex(349593196107334030177678842158399357)
print(x)
Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3: 0x4354467b746f6f5f736d616c6c3f7d

对于解密的RSA消息,可以执行以下操作:

import binascii


hexadecimals = hex(349593196107334030177678842158399357)


print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
print(binascii.unhexlify(hexadecimals[2:])) # python 3

这对我来说效果最好

"0x%02X" % 5  # => 0x05
"0x%02X" % 17 # => 0x11

如果你想要一个宽度更大的数字(2是2个十六进制打印字符),那么3会给你以下结果

"0x%03X" % 5  # => 0x005
"0x%03X" % 17 # => 0x011

你可以用另一种表达方式

[in] '%s' % hex(15)
[out]'0xf'

我把这个加起来,因为有时候你只想要个位数表示

(x可以是小写字母'x',也可以是大写字母'x',选择决定输出的字母是大写还是小写。):

'{:x}'.format(15)
> f

现在有了新的f''格式字符串,你可以做:

f'{15:x}'
> f

要添加0填充,可以使用0>n:

f'{2034:0>4X}'
> 07F2

注意:f'{15:x}'中的首字母'f'表示格式字符串

使用format(),根据format-examples,我们可以做到:

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

例如:

>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'

你也可以把任何基数的任何数字转换成十六进制。使用这一行代码,它很容易使用:

hex(int(n,x)).replace("0x","")

你有一个字符串n是你的数字,x是这个数字的底。首先,将其更改为整数,然后更改为十六进制,但十六进制的开头有0x,因此使用replace我们删除它。

对于Python >= 3.6,使用f-string格式:

>>> x = 114514
>>> f'{x:0x}'
'1bf52'
>>> f'{x:#x}'
'0x1bf52'