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

时间:2015-05-17 10:25:12

标签: python

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

  

0 - > ' \ X00'

     

15 - > ' \ X0F'

     

0xdeadbeef - > ' \ XDE \ XAD \ XBE \ XEF'

3 个答案:

答案 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 answermsvalkon's answer'How to split 16-bit unsigned integer into array of bytes in python?'的第二部分(“一次拉出一个字节”)。)