创建带有转义字符的字符串'\x';python中的数据和用户输入

创建带有转义字符的字符串'\x';python中的数据和用户输入,python,string,hex,Python,String,Hex,我正在尝试创建一个带有“\x”转义字符的用户输入字符串 我在做这样的事情- def create_hex_string(a, b): # a and b are integers of range (0-255) # convert decimal to hex and pad it with 0 # for eg: 10 -> 0x0a ahex = "{0:#0{1}x}".format(register,4) b

我正在尝试创建一个带有“\x”转义字符的用户输入字符串

我在做这样的事情-

    def create_hex_string(a, b): # a and b are integers of range (0-255)
        # convert decimal to hex and pad it with 0
        # for eg: 10 -> 0x0a
        ahex = "{0:#0{1}x}".format(register,4)
        bhex = "{0:#0{1}x}".format(value,4)
        str = "\x08\x{}\x00\x{}".format(ahex[2:], bhex[2:])
        return str
当我尝试执行此操作时,转义字符不再相关,它会给我一个错误

我还尝试使用文字字符串创建带有用户输入的十六进制字符串,比如-

str = r'\x08\x{}\x00\x{}'.format(ahex[2:], bhex[2:])
但是我没有找到一种方法将文本字符串转换回非文本字符串,从而可以识别转义字符

我还试图了解re.escape()的工作原理,但它会转义除ASCII以外的所有字符。任何关于这方面的建议都将不胜感激


更好的解释

我有一个带寄存器的外围硬件设备。我可以通过套接字在设备的特定寄存器中设置特定值

sock.send("\x80\x01")
此命令仅在双引号字符串时有效,因此\x转义字符有意义。 上面的命令将寄存器128设置为值1,因为- 0x80=128 0x01=1

基于这一思路,我创建了一个函数

1   def create_hex_string(register, value): # a and b are integers of range (0-255)
2       # funky stuff to convert register and value to hex.
3       # reghex = hex value of register (128 = 80 in hex)
4       # valhex = hex value of value (1 = 01 in hex)
5       str = "\x{}\x{}".format(reghex, valhex)
6   return str

7   cmd = create_hex_string(128, 1)
8   sock.send(cmd)
如果您看到,第5行将给出一个错误,它不接受。 我没有在第7行中使用双引号字符串,而是使用了带格式的文本字符串

5    str = r'\x{}\x{}'.format(reghex, valhex)
这样一来,我就失去了脱逃角色的意义


我希望这有助于更好地理解这个问题。如果我遗漏了什么,请告诉我,我将在下一次编辑中添加它。

您可以使用
chr()
函数从整数值创建一个单字符字符串

这就是你想做的吗

def create_hex_string(a, b): # a and b are integers of range (0-255)
    return "\x08{}\x00{}".format(chr(a), chr(b))

s = create_hex_string(65, 66)
assert s[0] == '\x08'
assert s[1] == 'A'
assert s[2] == '\x00'
assert s[3] == 'B'
assert s == "\x08\x41\x00\x42"

# The example from OP's comment:
assert create_hex_string(128, 1) == "\x08\x80\x00\x01"

请举例说明函数的输入和预期输出。您似乎希望生成的字符串长度为四个字节。第一个字节的值为8,第三个字节的值为NUL字节,第二个和第四个字节的值等于传入的数字。这是正确的吗?让我举一个例子-如果我以->a=128,b=1的形式发送参数,那么在格式化函数执行后,我的十六进制值将是-ahex=0x80 bhex=0x01 str=“\x08\x80\x00\x01”这有意义吗?请参阅我的答案。如果这没有帮助,请创建一个。请创建尽可能短的完整程序来演示错误。请包括您的程序的实际和预期输出。这就像一个魅力。我应该考虑自己使用chr()函数。谢谢你,罗布