我正在尝试使用带有'\ 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)
有了这个,我失去了转义字符的意义。
我希望这有助于更好地理解问题。如果我错过了什么,请告诉我,我将在下一次编辑中添加。
答案 0 :(得分:0)
您可以使用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"