在python

时间:2017-04-28 02:09:16

标签: 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)
        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)

有了这个,我失去了转义字符的意义。

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

1 个答案:

答案 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"