将整数转换为十六进制转义字符串的最pythonic方法是什么?
0 - > ' \ X00'
15 - > ' \ X0F'
0xdeadbeef - > ' \ XDE \ XAD \ XBE \ XEF'
答案 0 :(得分:4)
没有办法直接做你想做的事情,但你自己并不难做到。
例如,您可以将整个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?我认为它们非常简单,如果你将它们包装在一个具有适当名称的函数中,没有人会抱怨,但是如果你只是将它们插入到你的代码中就足够复杂了,它就不会很Python的。 (我个人使用pairwise
版本,因为我总是首先考虑itertools
,但那只是我。)
答案 1 :(得分:1)
您是想要1字节字符串'\x0f'
还是6字节字符串"'\\x0f'"
(即打印时看起来像'\x0f'
的字符串)有点含糊不清。如果你的意思是前者,这是一种方法:
s = '%x' % 0xdeadbeef
binascii.unhexlify('0' + s if len(s) % 2 else s)
答案 2 :(得分:1)
不确定'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))
(灵感来自abarnert's answer和msvalkon's answer至'How to split 16-bit unsigned integer into array of bytes in python?'的第二部分(“一次拉出一个字节”)。)