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

0->'\\ x00'

15->'\\ x0f'

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

===============>>#1 票数: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))

哪一个是最适合Python的? 我认为它们都很简单,以至于如果将它们包装在一个具有适当名称的函数中,没有人会抱怨,但是都非常复杂,以至于只要将它们内联到代码中,它就不会很Python化。 (我个人使用pairwise版本,因为我总是首先想到itertools ,但这就是我。)

===============>>#2 票数:1

您是想要1字节的字符串'\\x0f'还是6字节的字符串"'\\\\x0f'" (即,打印时看起来像'\\x0f'的字符串),这有点'\\x0f' 如果您的意思是前者,这是一种实现方法:

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

===============>>#3 票数: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回答的第二部分(“一次删除一个字节”)和msvalkon回答 “如何将16位无符号整数拆分为python中的字节数组?” 启发 。)

  ask by 0x00 translate from so

未解决问题?本站智能推荐: