在Python中向变量添加转义字符
我需要向一个变量添加一个转义字符,并将其附加到另一个字符串中,然后让它应用其效果。这就是我所拥有的:在Python中向变量添加转义字符,python,Python,我需要向一个变量添加一个转义字符,并将其附加到另一个字符串中,然后让它应用其效果。这就是我所拥有的: h1 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'] h2 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'] h3 = list(itertools.product(h1, h2))
h1 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
h2 = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
h3 = list(itertools.product(h1, h2))
h4 = []
for item in h3:
h4.append(''.join(item))
temp = r'\x' + str(h4[0]) + '\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
因此,如果我有\xh,我需要具有十六进制值hh的字符,但在python中,除了\x之外,我似乎找不到任何可以实现这一点的字符,我似乎无法在变量上使用它
有什么建议吗?使用int()
将十六进制值转换为整数,然后使用chr()
将该数字转换为字符:
import itertools
hexdigits = "123456789abcdef"
for dig1, dig2 in itertools.product(hexdigits, hexdigits):
char = chr(int(dig1 + dig2, 16))
temp = char + '\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c'
重复
int
/chr
调用(假设您使用的不仅仅是生成的第一个字节)的一个更快的解决方案是创建一个完整的十六进制字符串并一次性解析它:
import itertools
import binascii
hexdigits = "123456789abcdef"
completehex = ''.join(map(''.join, itertools.product(hexdigits, repeat=2)))
completebytes = binascii.unhexlify(completehex)
这将把所有的十六进制对大容量解码为原始字节值(您想要的“转义”),因此完整字节
将是'\x00\x01\x02\x03…\xfd\xfe\xff'
当然,对于这种特定情况(如果您真正的问题不只是按顺序生成所有可能的字节值),您可以进一步简化它,因为您所做的只是生成所有可能的字节值:
# Py3
completebytes = bytes(range(256))
# On Py2, bytes is alias for str, so must use bytearray first to accept iterable of int
completebytes = bytes(bytearray(range(256)))
或者,只是为了好玩,最快的方式滥用maketrans
:
# Py3:
completebytes = bytes.maketrans(b'', b'') # Add .decode('latin-1') if you really want str
# Py2:
import string
completebytes = string.maketrans('', '')
为了回答OP问题,这里有一种使用转义符号将包含两个十六进制数字的字符串转换为字符的方法
h = '11'
temp = eval( r"'\x" + h + "'" )
然而,这并不是进行转换的最佳方式(参见其他答案)。我建议
chr(int(h,16))
。另一种方法是使用整数而不是字符串h=0x11
和temp=chr(h)
为什么要计算所有的乘积,但只使用一个值?说明:你并不真正想要“转义”。转义用于字符串文字来表示原始字节值(从0到255)或原始Unicode序号(对于Py2Unicode
或Py3str
),您不需要实际生成转义代码来将序号转换为字节
/str
值。答案解释了你是如何跳过转义而得到你真正想要的东西的?如果你真的想生成转义文本并让Python处理它们,这比eval
要好(它避免了eval
执行任意代码的风险),而decode
使用(在Py3中,只有后者存在)更好。我只是想在评估之前提一下这些更好的选项<代码>评估应该位于任何选项层次结构的绝对底部。你是对的。这就是我写“这不是最好的方法[…]”时的意思(我可能没有坚持足够多)。我还建议使用eval
作为最后一个选项。然而,OP的问题是如何在变量中添加转义字符。