将整数转换为十六进制转义字符串的Pythonic方法

将整数转换为十六进制转义字符串的Pythonic方法,python,Python,将整数转换为十六进制转义字符串的最适合的方法是什么 0->'\x00' 15->'\x0f' 0xdeadbeef->'\xde\xad\xbe\xef' 没有办法直接做你想做的事,但你自己做也不难 例如,您可以将整个int转换为十六进制,然后在每对字符之前插入一个\x字符: n = 0xdeadbeef x = format(n, 'x') s = re.sub('(..)', r'\\x\1', x) # or s = ''.join(r'\x{}{}'.format(*b) for b i

将整数转换为十六进制转义字符串的最适合的方法是什么

0->'\x00'

15->'\x0f'

0xdeadbeef->'\xde\xad\xbe\xef'


没有办法直接做你想做的事,但你自己做也不难

例如,您可以将整个int转换为十六进制,然后在每对字符之前插入一个
\x
字符:

n = 0xdeadbeef
x = format(n, 'x')
s = re.sub('(..)', r'\\x\1', x)
# or s = ''.join(r'\x{}{}'.format(*b) for b in pairwise(x))
# or s = ''.join(r'\x' + x[i:i+2] for i in range(0, len(x), 2))
或者您可以一次提取一个字节,然后自己格式化:

x = []
while n:
    x.append(n % 256)
    n //= 256
s = ''.join(r'\x{:02x}'.format(b) for b in reversed(x))

哪一个最像蟒蛇?我认为它们都很简单,如果你用一个合适的名字将它们封装在一个函数中,没有人会抱怨,但是它们都很复杂,如果你只是把它们内联到你的代码中,它就不会是非常pythonic的。(我个人会两两使用
版本,因为我总是先想到
itertools
,但那就是我。)

你想要的是1字节字符串
'\x0f'
还是6字节字符串
“\\x0f'
(即打印时看起来像
'\x0f'
)有点模棱两可。如果你指的是前者,这里有一种方法:

s = '%x' % 0xdeadbeef
binascii.unhexlify('0' + s if len(s) % 2 else s)

不确定这是否是“pythonic”,但这里有一个使用递归函数的解决方案:

def uint_tuple_to_bytes(t):
        if t[0] < 0x100:
                return t
        else:
                return uint_tuple_to_bytes(divmod(t[0], 0x100) + t[1:])

def uint_to_bytes(i):
        return uint_tuple_to_bytes((i,))

def uint_to_binary_string(i):
        return ''.join(chr(byte) for byte in uint_to_bytes(i))
def uint\u元组到字节(t):
如果t[0]<0x100:
返回t
其他:
返回uint\u元组到字节(divmod(t[0],0x100)+t[1:]
定义单位到单位字节(i):
返回uint\u元组到字节((i,))
定义单元到二进制字符串(i):
返回“”

(灵感来源于to的第二部分(“一次提取一个字节”)

@Lix:这绝对不是这个问题的重复,这个问题专门询问值