将整数转换为十六进制转义字符串的Pythonic方法
将整数转换为十六进制转义字符串的最适合的方法是什么 0->'\x00' 15->'\x0f' 0xdeadbeef->'\xde\xad\xbe\xef'将整数转换为十六进制转义字符串的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
没有办法直接做你想做的事,但你自己做也不难 例如,您可以将整个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:这绝对不是这个问题的重复,这个问题专门询问值